2017-05-25 24 views
1

3列のテーブル:id, field1, field2があります。MySQL:変更前の値を使用して列を更新する方法

行があります。id=1, field1=1, field2=1です。

実行更新SQL:ID = 1、フィールド1 = 2、フィールド2 = 2:UPDATE my_table SET field1=field2+1, field2=field1+1 WHERE id=1;

私は結果が期待。しかし、実際に私は得た: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

ところで:フィールドIDは、IF句を使用する必要がある場合

  • は、exprはのような、より複雑になります他のすべてのDBMSでは、mysqlだけが標準SQLに従わずにスキューアップします。( – dnoeth

  • +1

    一時変数は良い考えです!しかし、INSERT ... ON DUPLICATE KEY UPDATE ...で一時変数を使用する構文は何ですか? – 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値を一時変数にコピーする。直接設定 `= B、B = A`を使用して2つの列を交換する作業をされて、

      ((@t1:=f1 & @t2:=f2) || TRUE) AND (Your Condition) 
      
    関連する問題