非常に単純な質問ですが、答えが見つかりませんでした。
var
列foo
とが含まれるテーブルがありbar
、どちらも整数であり、現在は0であるとします。
私が実行した場合:
UPDATE var SET foo=foo+1, bar=foo+1
では、の値はどうなるbar
でしょうか?1または2?
順番を入れ替えても変わりますか?
UPDATE var SET bar=foo+1, foo=foo+1
JoeのSQLFiddleコメントで示されているように、列の更新が実行される順序は確かに重要です。のMySQLドキュメントUPDATE
はこれを示しており、各列の更新の式は宣言された順序で評価され、常に列の「現在の」値を使用すると述べています。
式で更新するテーブルの列にアクセスする場合
UPDATE
は、列の現在の値を使用します。たとえば、次のステートメントはcol1
、現在の値より1つ多く設定されます。UPDATE t1 SET col1 = col1 + 1;
次のステートメントの2番目の割り当ては、元の値ではなく
col2
、現在の(更新された)col1
値に設定されcol1
ます。結果はそれcol1
でcol2
あり、同じ値を持ちます。この動作は、標準のSQLとは異なります。UPDATE t1 SET col1 = col1 + 1, col2 = col1;
単一テーブルのUPDATE割り当ては、通常、左から右に評価されます。複数テーブルの更新の場合、割り当てが特定の順序で実行される保証はありません。
したがって、のはUPDATE var SET foo=foo+1, bar=foo+1
、foo
に設定されfoo+1
、bar
更新では新しく設定されfoo
たinの値が使用されますfoo+1
。
この動作はSQL標準とは異なることに注意することも価値があります。これは、すべての列の更新が概念的に「同時に」行われる必要があることを示しています。
MySQLでは順序は重要です。さらに、次のことができます。
update test set foo=foo+1, bar=foo+1, foo=bar+1;
ところで、ここにもう1つの便利なMySQL固有のトリックがあります。
insert into test (foo, bar) values ('some text', MD5(foo));
注意してください-postgresqlの場合、クエリは、クエリの実行中に動的に変化する値ではなく、クエリの開始時に値を使用して実行されます
create table test (
field1 int2 default 0,
field2 int2 default 0
);
insert into test values (1, 2);
update test set field1 = field2, field2 = field1 +1;
select * from test;
結果:
field1, field2
2,2
順序に関係なくfoo=1、bar = 1 [編集:MS-SQLで。(どうやらMySQLで私の悪い)]