设置前SQL更新读取列值
我在SO和google上都搜索过这些信息,但没有找到任何权威的答案 当您有如下更新语句时:设置前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更新语义的一部分,是否在标准中,或者是否是实现细节(因此可能会发生更改)。
UPDATE table SET rowA = rowB, rowB = NULL ...
似乎:
- 排序并不重要(
)更新表集rowB=NULL,rowA=rowB
- 尽管如此,结果是rowA在rowB中获取prev值,因为UPDATE似乎首先读取以前的值,然后更新它们
这是标准行为。引用行时,引用的是更新前版本 在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,…)提到它是标准行为?)我找不到任何!正是我要找的!非常感谢。