SQL UPDATE在设置之前读取列值

Lor*_*tté 5 sql standards sql-update semantics

我在搜索引擎优化和谷歌搜索了这些信息,但没有找到任何权威的答案.

如果您有更新语句,例如:

UPDATE table SET rowA = rowB, rowB = NULL ...
Run Code Online (Sandbox Code Playgroud)

看起来:

  • 订购并不重要(UPDATE table SET rowB = NULL, rowA = rowB)
  • 尽管如此,结果是rowA取rowB中的prev值,因为看起来UPDATE首先读取先前的值,然后更新它们.

我想知道以上两点对于SQL 是否正确,即它们是否是SQL UPDATE语义的一部分,如果它们在标准中,或者它是实现细节(因此可能会发生变化).谢谢!

编辑:让我强调我想要一个"权威"的答案; 我已经在一些SQL实现上测试过,行为确实是这里描述的行为.我需要的是一个"证据",它实际上是UPDATE的SQL标准/规范/语义,带有标准的链接,或者代替可靠的源(MSDN,dev.mysql.com,Oracle或PostgreSQL) docs,...)

Mik*_*keD 5

James R. Groff,Paul N. Weinberg:SQL完整参考(Osborne 1999),第209页

开始报价

如果分配列表中的表达式引用目标表的列之一,则用于计算该表达式的值是应用任何更新之前当前行中该列的值 。WHERE子句中出现的列引用也是如此。例如,考虑以下(有些人为的)UPDATE语句:

UPDATE OFFICES
 SET QUOTA = 400000.00, SALES = QUOTA
WHERE QUOTA < 400000.00
Run Code Online (Sandbox Code Playgroud)

在更新之前,Bill Adams的QUOTA身价为$ 350,000,SALES价值为$ 367,911。更新后,他的行的SALES价值为$ 350,000,而不是$ 400,000。因此,SET子句中的分配顺序无关紧要。可以按任何顺序指定分配。

结束语

ANSI-92 SQL标准(X3H2-93-004)草案的第13.9章第6页第393页对此提供了支持,可在此处找到。

到目前为止,这是最独立于实现的,也是我能得到的最接近的。

X3H2-93-004的其他来源可在此处找到(第590页,项目15)