设置前SQL更新读取列值

设置前SQL更新读取列值,sql,sql-update,standards,semantics,Sql,Sql Update,Standards,Semantics,我在SO和google上都搜索过这些信息,但没有找到任何权威的答案 当您有如下更新语句时: UPDATE table SET rowA = rowB, rowB = NULL ... 似乎: 排序并不重要(更新表集rowB=NULL,rowA=rowB) 尽管如此,结果是rowA在rowB中获取prev值,因为UPDATE似乎首先读取以前的值,然后更新它们 我想知道以上两点对于SQL是否普遍适用,即它们是否是SQL更新语义的一部分,是否在标准中,或者是否是实现细节(因此可能会发生更改)。

我在SO和google上都搜索过这些信息,但没有找到任何权威的答案

当您有如下更新语句时:

UPDATE table SET rowA = rowB, rowB = NULL ...
似乎:

  • 排序并不重要(
    更新表集rowB=NULL,rowA=rowB
  • 尽管如此,结果是rowA在rowB中获取prev值,因为UPDATE似乎首先读取以前的值,然后更新它们
我想知道以上两点对于SQL是否普遍适用,即它们是否是SQL更新语义的一部分,是否在标准中,或者是否是实现细节(因此可能会发生更改)。 谢谢

编辑:让我强调我想要一个“权威”的答案;我已经在许多SQL实现上进行了测试,结果表明该行为确实与这里描述的行为相同。我需要的是一个“证据”,证明这实际上是在SQL标准/spec/semantics of UPDATE中,并带有一个指向标准的链接,或者指向一个代理可靠源(MSDN、dev.mysql.com、Oracle或PostgreSQL文档,…)


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

在SQL server中,可以使用
output
子句可视化两行版本

update  YourTable
set     col1 = col1 + 1
output  deleted.col1   -- Pre-update version of row
,       inserted.col1  -- Post-update version of row

来自
更新的postgeSQL文档

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

,第209页,美国

起始报价

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

UPDATE OFFICES
 SET QUOTA = 400000.00, SALES = QUOTA
WHERE QUOTA < 400000.00
更新办公室
设置配额=400000.00,销售=配额
其中配额<400000.00
在更新之前,比尔·亚当斯的配额价值为35万美元,销售额为35万美元 $367,911. 更新后,他的行的销售额为350000美元,而不是400000美元。这个 因此,SET子句中的赋值顺序无关紧要;作业可以是 以任何顺序指定

结束报价

ANSI-92 SQL标准(X3H2-93-004)草案第393页第13.9章第6项也支持这一点

这是迄今为止最独立的实现,也是最接近的实现


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

谢谢。你有任何与标准的链接吗?(或者对一个“代理”,官方来源(MSDN,dev.mysql,…)提到它是标准行为?)我找不到任何!正是我要找的!非常感谢。