5

SO と Google の両方でこの情報を検索しましたが、信頼できる回答は見つかりませんでした。

次のような更新ステートメントがある場合:

UPDATE table SET rowA = rowB, rowB = NULL ...

のようだ:

  • 順序は重要ではありません ( UPDATE table SET rowB = NULL, rowA = rowB)
  • それにもかかわらず、UPDATE は最初に前の値を読み取り、次にそれらを更新するように見えるため、rowA は rowB の前の値を取得します。

上記の 2 つの点が一般的に SQL に当てはまるかどうか、つまり、それらがSQL UPDATE セマンティクスの一部であるかどうか、標準に含まれているかどうか、または実装の詳細である (したがって変更される可能性がある) かどうかを知りたいです。ありがとう!

編集:「信頼できる」回答が必要であることを強調しておきます。動作が実際にここに示されているものであることを、私はすでに多くの SQL 実装でテストしました。私が必要としているのは、これが実際に UPDATE の SQL 標準/仕様/セマンティクスに含まれていることの「証明」であり、標準へのリンク、または代替の信頼できるソース (MSDN、dev.mysql.com、Oracle または PostgreSQL) へのリンクがあります。ドキュメント、...)

4

3 に答える 3

6

James R. Groff、Paul N. Weinberg: SQL The complete reference (Osborne 1999)の 209 ページには、次のように記載されています。

見積もりを開始

割り当てリストの式がターゲット テーブルの列の 1 つを参照する場合、式の計算に使用される値は、 更新が適用される前の現在の行のその列の値です。同じことが、WHERE 句で発生する列参照にも当てはまります。たとえば、次の (やや不自然な) UPDATE ステートメントを考えてみましょう。

UPDATE OFFICES
 SET QUOTA = 400000.00, SALES = QUOTA
WHERE QUOTA < 400000.00

更新前の Bill Adams のQUOTA価値は $350,000 で、SALES価値は $367,911 でした。更新後、彼の行のSALES値は 400,000 ドルではなく 350,000 ドルになりました。したがって、SET 句での割り当ての順序は重要ではありません。割り当ては任意の順序で指定できます。

引用を終了

同じことが ANSI-92 SQL 標準 (X3H2-93-004) のドラフトの 13.9 項目 6、ページ 393 でサポートされています

これは、最も実装に依存せず、これまでのところ最も近いものです。

X3H2-93-004 の他の情報源は、たとえばここ(pg 590、項目 15)で見つけることができます。

于 2013-04-10T07:28:09.997 に答える
1

これは標準的な動作です。行を参照する場合は、更新前のバージョンを参照します。

outputSQL サーバーでは、2 つの行バージョンを句で視覚化できます。

update  YourTable
set     col1 = col1 + 1
output  deleted.col1   -- Pre-update version of row
,       inserted.col1  -- Post-update version of row
于 2013-04-02T09:40:01.497 に答える