MySQL:如何在更改前使用值更新列

MySQL:如何在更改前使用值更新列,mysql,sql,Mysql,Sql,有一个表有三列:id、field1、field2 还有一行:id=1,field1=1,field2=1 运行更新SQL:updatemyu表集field1=field2+1,field2=field1+1,其中id=1 我期望结果是:id=1,field1=2,field2=2。但事实上我得到了:id=1,field1=2,field2=3。因为在计算field2=field1+1时,field1的值已更改 我想出了一个SQL来解决这个问题: UPDATE my_table dest, (SE

有一个表有三列:
id、field1、field2

还有一行:
id=1,field1=1,field2=1

运行更新SQL:
updatemyu表集field1=field2+1,field2=field1+1,其中id=1

我期望结果是:id=1,field1=2,field2=2。但事实上我得到了:id=1,field1=2,field2=3。因为在计算field2=field1+1时,field1的值已更改

我想出了一个SQL来解决这个问题:

UPDATE my_table dest, (SELECT * FROM my_table) src
SET dest.field1=src.field2+1, dest.field2=src.field1+1
WHERE dest.id=1;
但是,我想插入一条记录,如果该行存在,则执行如上所述的更新

INSERT INTO my_table (id, field1, field2) VALUES(1, 1, 1)
ON DUPLICATE KEY UPDATE
    field1=field2+1, field2=field1+1;
此SQL的问题与第一个SQL相同。那么,如何使用重复密钥更新上的
子句中的
更改前的值来执行此更新呢


谢谢你的帮助

除了一个临时变量之外,想不出其他任何东西。但是,我想不出一种让SQL语法工作的方法,除了:

set @temp = 0;
update test.test set 
    f1 = (@temp:=f1), 
    f1 = f2 + 1, 
    f2 = @temp + 1 
where id = 1;

希望这对你有所帮助,更希望它能帮助你找到更好的方法:)

我找到了一个窍门

使用该子句创建临时变量。字段更新使用临时变量进行计算

INSERT INTO my_table (id, f1, f2) VALUES(1, 1, 1)
ON DUPLICATE KEY UPDATE
    id=IF((@t1:=f1 & @t2:=f2), 1, 1), f1=@t2+1, f2=@t1+1;
需要注意的是:

  • 演出有点慢。特别是将文本值复制到临时变量

  • 如果字段id需要使用If子句,则expr将更加复杂,如:

    ((@t1:=f1 & @t2:=f2) || TRUE) AND (Your Condition)
    

  • 顺便说一句,使用
    SET a=b,b=a直接交换两列在其他DBMS中都有效,只有mysql不遵循标准SQL并将其向上倾斜:(Temp变量是个好主意!但是在
    插入中使用Temp变量的语法是什么?