请考虑以下更新语句:
UPDATE tbl_book
SET return_date = planned_return_date,
planned_return_date = null
WHERE book_id = 12;
我想这个更新是这样工作的:
在tbl\u book表中找到id匹配的记录,并设置
返回日期为计划返回日期的值
之后,将计划返回日期的值设为空
我的假设正确吗?set子句的顺序重要吗?我甚至猜测,作业中的列引用总是反映“旧”记录的值,对吗?那样的话,订购就不重要了。。。
编辑2018-11-08:为了澄清,我用mysql和postgresql标记了我的查询,因为我需要知道两者的答案。
3条答案
按热度按时间0pizxfdo1#
根据sql标准,它不应该在这些表达式中使用更新的值。2003年规范1的相关文本规定:
这个
<update source>
每个的<set clause>
在t的任何一行被更新之前,对t的每一行有效地求值。哪里
<update source>
中每个赋值运算符右侧的部分SET
条款。看起来mysql可能没有遵循这里的标准,但我相信postgresql和大多数其他数据库产品会遵循。对于mysql,这是有文档记录的:
下面语句中的第二个赋值
col2
到当前(已更新)col1
价值,而不是原来的col1
价值观。结果是col1
以及col2
具有相同的值。此行为与标准sql不同。(我的重点)
1第14.11节
<update statement: searched>
基础的。2003标准的选择是随意的,我不认为在不同版本的标准之间有太大的变化。hfwmuf9z2#
您的查询是:
在进行
update
,将表看作每个记录有两个版本——我们称它们为“old”和“new”,因为这是触发器中常用的术语。价值是
set
在新的记录里。另一边的值=
来自旧唱片。ni65a41a3#
set子句的顺序重要吗?是的顺序是一个问题(对于mysql)这里的原因,如果你做下面的查询然后
输出将是
但如果你这样做,那么输出将低于
所以顺序是集合子句中的一个问题