一尘不染

SQL UPDATE在设置之前读取列值

sql

我已经在SO和google上搜索了此信息,但没有找到任何权威性的答案。

当您有如下更新语句时:

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,…)


阅读 143

收藏
2021-05-23

共1个答案

一尘不染

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

开始报价

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

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

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

结束语

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

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

2021-05-23