我在搜索引擎优化和谷歌搜索了这些信息,但没有找到任何权威答案。
如果您有更新声明,请执行以下操作:
UPDATE table SET rowA = rowB, rowB = NULL ...
似乎:
UPDATE table SET rowB = NULL, rowA = rowB
)我想知道以上两点是否一般为SQL,即如果它们是 SQL UPDATE语义的一部分,如果它们在标准,或者它是否是实施细节(因此可能会有变化)。 谢谢!
编辑:让我强调我想要一个“权威”的答案;我已经在一些SQL实现上测试了行为确实是这里描述的行为。我需要的是一个“证据”,它实际上是UPDATE的SQL标准/规范/语义,带有标准的链接,或者代替可靠的源(MSDN,dev.mysql.com,Oracle或PostgreSQL) docs,...)
答案 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)
来自update
(http://www.postgresql.org/docs/8.3/static/sql-update.html)
的表达强>
要分配给列的表达式。表达式可以使用表中此列和其他列的旧值。