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

时间:2017-05-25 18:44:09

标签: mysql sql

有一个包含三列的表格: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子句更改前的值进行此更新?

感谢您的帮助!

2 个答案:

答案 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;

有一点需要注意:

  1. 表现有点慢。特别是将TEXT值复制到临时变量。

  2. 如果字段id需要使用IF子句,则expr会更复杂,如:

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