2017-05-25 31 views
1

有一個包含三列的表:id, field1, field2MySQL:如何在更改之前使用值更新列

還有一行: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子句更改前的值來執行此更新?

感謝您的幫助!

回答

1

除了臨時變量之外別無他法。然而,也想不出辦法讓SQL語法的工作,除此之外:

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

希望這會有所幫助,並希望更多的它可以幫助你找到一個更好的辦法:)

+0

順便說一句,使用'集合A = B,B =直接了'交換兩列工作在其他所有DBMS中,只有mysql不遵循標準SQL並將其傾斜: – dnoeth

+1

Temp變量是一個好主意!但是,在INSERT ... ON DUPLICATE KEY UPDATE ...中使用temp變量的語法是什麼? – someblue

0

我找到了欺騙的方式來做到這一點。使用IF子句創建臨時變量。字段更新使用temp變量進行計算。

INSERT INTO my_table (id, f1, f2) VALUES(1, 1, 1) 
ON DUPLICATE KEY UPDATE 
    id=IF((@t1:=f1 & @t2:=f2), 1, 1), [email protected]+1, [email protected]+1; 

有一些問題需要注意:

  1. 表現是有點慢。特別是將TEXT值複製到臨時變量。

  2. 如果id字段需要使用IF子句,EXPR將更加複雜,如:

    ((@t1:=f1 & @t2:=f2) || TRUE) AND (Your Condition) 
    
相關問題