update列,其值为在同一更新中更新的其他列的值

rks48beu  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(374)

请考虑以下更新语句:

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标记了我的查询,因为我需要知道两者的答案。

0pizxfdo

0pizxfdo1#

根据sql标准,它不应该在这些表达式中使用更新的值。2003年规范1的相关文本规定:
这个 <update source> 每个的 <set clause> 在t的任何一行被更新之前,对t的每一行有效地求值。
哪里 <update source> 中每个赋值运算符右侧的部分 SET 条款。
看起来mysql可能没有遵循这里的标准,但我相信postgresql和大多数其他数据库产品会遵循。对于mysql,这是有文档记录的:
下面语句中的第二个赋值 col2 到当前(已更新) col1 价值,而不是原来的 col1 价值观。结果是 col1 以及 col2 具有相同的值。此行为与标准sql不同。

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

(我的重点)
1第14.11节 <update statement: searched> 基础的。2003标准的选择是随意的,我不认为在不同版本的标准之间有太大的变化。

hfwmuf9z

hfwmuf9z2#

您的查询是:

UPDATE tbl_book 
    SET return_date = planned_return_date, 
        planned_return_date = null 
    WHERE book_id = 12;

在进行 update ,将表看作每个记录有两个版本——我们称它们为“old”和“new”,因为这是触发器中常用的术语。
价值是 set 在新的记录里。另一边的值 = 来自旧唱片。

ni65a41a

ni65a41a3#

set子句的顺序重要吗?是的顺序是一个问题(对于mysql)这里的原因,如果你做下面的查询然后

create table t 
(
id int, id1 int, id2 int
);
insert into t 
values 
(1,2,3),
 (1,2,4);
select * from t;

update t 
set id2=null,
id1=id2

where id1=2;
select * from t

输出将是

id id1 id2
1  null null
1  null null

但如果你这样做,那么输出将低于

update t 
set 
id1=id2,
id2=null

id id1 id2
1  3   null
1  4   null

所以顺序是集合子句中的一个问题

相关问题