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变量的语法是什么?
?