42

次のクエリでの評価の順序は何ですか:

UPDATE tbl SET q = q + 1, p = q;

つまり、または?"tbl"."p"に設定されます。ここでの評価の順序は SQL 標準によって管理されていますか?qq + 1

ありがとう。

アップデート

Migs の回答を検討した後、見つけたすべての DB でいくつかのテストを実行しました。標準の内容はわかりませんが、実装はさまざまです。

与えられた

CREATE TABLE tbl (p INT NOT NULL, q INT NOT NULL);
INSERT INTO tbl VALUES (1, 5);   -- p := 1, q := 5
UPDATE tbl SET q = q + 1, p = q;

"p"との値"q"は次のとおりです。

database           p   q
-----------------+---+---
Firebird 2.1.3   | 6 | 6  -- But see "Update 2" below
InterBase 2009   | 5 | 6
MySQL 5.0.77     | 6 | 6  -- See "Update 3" below
Oracle XE (10g)  | 5 | 6
PostgreSQL 8.4.2 | 5 | 6
SQLite 3.3.6     | 5 | 6
SQL Server 2016  | 5 | 6

更新 2

Firebird 2.5 は、私がテストした他の SQL エンジンの大部分と一致するように動作を変更し、MySQL だけを残しました。関連するリリース ノートのエントリ「SET 句のロジックの変更」は、大多数の動作が SQL 仕様に従って正しいことを強く示唆しています。

MySQL にバグを報告して、この動作についてコメントしてもらいました (バグ番号52861 )。

更新 3

前述のバグは本日 (2010-05-19) クローズされ、 UPDATEの説明と標準 SQL との相違点のセクションの両方でこの動作が明示されるようにドキュメント セットが更新されます。

ブラボー、MySQL。

4

3 に答える 3

14

MySQL は「左から右」の評価を行い、新しい値を「認識」します。(5.0.45-community-nt-log MySQL Community Edition でテスト済み)

さらに、MySQL マニュアルから: 「単一テーブルの UPDATE 割り当ては、通常、左から右に評価されます。複数テーブルの更新では、割り当てが特定の順序で実行されるという保証はありません。」

さて、評価の順序が重要であることを考えると、「一般的に」は非常に曖昧であり、「保証なし」は非常に悪いです。

それで、質問に答えるために:「SQL標準」によって指定された動作ですか、それとも単なる慣例ですか?


更新: 「13.10 更新ステートメント: 検索済み」項目「6) (値式) は、T の行を更新する前に、T の各行に対して効果的に評価される」と述べている SQL92 仕様を入手しました。

私見は完全に明確ではありませんが、標準は自分の更新の結果を「見る」ことではないと考えるのに十分です。あなたの例を考えると、Oracle、PostgreSQL、および Interbase がそれを行う方法です。

于 2010-04-13T20:06:02.640 に答える
7

は、そのUPDATE作業の結果を確認していません。

pq更新前の時点でに設定されます。

次のコードは、列を入れ替えるだけです。

DECLARE @test TABLE (p INT, q INT)

INSERT
INTO    @test
VALUES  (2, 3)

SELECT  *
FROM    @test

p    q
---  ---
  2    3

UPDATE  @test
SET     p = q,
        q = p

SELECT  *
FROM    @test

p    q
---  ---
  3    2
于 2010-02-04T21:07:07.557 に答える
-1

テーブルへの書き込みは、読み取りが完了したときに進行中のトランザクションの後に発生する必要があります。

于 2010-02-04T21:05:33.960 に答える