有一个包含三列的表格:id, field1, field2
。
还有一行:id=1, field1=1, field2=1
。
运行更新SQL:UPDATE my_table SET field1=field2+1, field2=field1+1 WHERE 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相同的问题。那么如何使用ON DUPLICATE KEY UPDATE
子句更改前的值进行此更新?
感谢您的帮助!
答案 0 :(得分:1)
除了临时变量之外别无他法。但是,除了这个之外,无法想出一种使SQL语法工作的方法:
set @temp = 0;
update test.test set
f1 = (@temp:=f1),
f1 = f2 + 1,
f2 = @temp + 1
where id = 1;
希望这会有所帮助,并希望能帮助您找到更好的方法:)
答案 1 :(得分:0)
我找到了一种方法来做到这一点。
使用IF子句创建临时变量。字段更新使用临时变量来计算。
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;
有一点需要注意:
表现有点慢。特别是将TEXT值复制到临时变量。
如果字段id需要使用IF子句,则expr会更复杂,如:
((@t1:=f1 & @t2:=f2) || TRUE) AND (Your Condition)