4

非常に単純な質問ですが、答えが見つかりませんでした。

varfooとが含まれるテーブルがありbar、どちらも整数であり、現在は0であるとします。

私が実行した場合:

UPDATE var SET foo=foo+1, bar=foo+1

では、の値はどうなるbarでしょうか?1または2?

順番を入れ替えても変わりますか?

UPDATE var SET bar=foo+1, foo=foo+1

4

4 に答える 4

7

JoeのSQLFiddleコメントで示されているように、列の更新が実行される順序は確かに重要です。のMySQLドキュメントUPDATEはこれを示しており、各列の更新の式は宣言された順序で評価され、常に列の「現在の」値を使用すると述べています。

式で更新するテーブルの列にアクセスする場合UPDATEは、列の現在の値を使用します。たとえば、次のステートメントはcol1、現在の値より1つ多く設定されます。

UPDATE t1 SET col1 = col1 + 1;

次のステートメントの2番目の割り当ては、元の値ではなくcol2、現在の(更新された)col1値に設定されcol1ます。結果はそれcol1col2あり、同じ値を持ちます。この動作は、標準のSQLとは異なります。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

単一テーブルのUPDATE割り当ては、通常、左から右に評価されます。複数テーブルの更新の場合、割り当てが特定の順序で実行される保証はありません。

したがって、のはUPDATE var SET foo=foo+1, bar=foo+1fooに設定されfoo+1bar更新では新しく設定されfooたinの値が使用されますfoo+1

この動作はSQL標準とは異なることに注意することも価値があります。これは、すべての列の更新が概念的に「同時に」行われる必要があることを示しています。

于 2013-02-20T20:47:15.613 に答える
2

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));
于 2013-02-20T20:35:59.717 に答える
0

注意してください-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
于 2013-02-20T21:53:18.087 に答える
-2

順序に関係なくfoo=1、bar = 1 [編集:MS-SQLで。(どうやらMySQLで私の悪い)]

于 2013-02-20T20:29:22.443 に答える