SQL UPDATE在设置之前读取列值

时间:2013-04-02 09:23:15

标签: sql sql-update standards semantics

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

如果您有更新声明,请执行以下操作:

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

似乎:

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

我想知道以上两点是否一般为SQL,即如果它们是 SQL UPDATE语义的一部分,如果它们在标准,或者它是否是实施细节(因此可能会有变化)。 谢谢!

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

3 个答案:

答案 0 :(得分:4)

James R. Groff, Paul N. Weinberg: SQL The complete reference (Osborne 1999),第209页说明

开始引用

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

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

在更新之前,Bill Adams的QUOTA价值为$ 350,000,价值SALES为 $三十六万七千九百十一。更新后,他的行的SALES值为$ 350,000,而不是$ 400,000。该 因此,SET子句中赋值的顺序并不重要;作业可以 以任何顺序指定。

结束语

ANSI-92 SQL标准(X3H2-93-004)的草案第13.9章第393页支持同样的内容,here

这是最独立的实施方式,也是我迄今为止最接近的实现方式。

可以找到X3H2-93-004的其他来源,例如here(第590页,第15项)

答案 1 :(得分:1)

这是标准行为。引用行时,请参阅更新前版本。

在SQL Server中,可以使用output子句

显示两行版本
update  YourTable
set     col1 = col1 + 1
output  deleted.col1   -- Pre-update version of row
,       inserted.col1  -- Post-update version of row

答案 2 :(得分:0)

来自updatehttp://www.postgresql.org/docs/8.3/static/sql-update.html

的postgeSQL文档
  

表达
  要分配给列的表达式。表达式可以使用表中此列和其他列的旧值。