在某些情况下,我必须将值从一列复制到另一列,并将第一列设置为NULL。此SQL语句按预期工作:
UPDATE lessons SET order_id_old = order_id, order_id = NULL WHERE id = 1
但我不确定这是否是正确的做法。或者我应该为此目的更好地使用2个查询?
UPDATE lessons SET order_id_old = order_id WHERE id = 1;
UPDATE lessons SET order_id = NULL WHERE id = 1;
答案 0 :(得分:3)
我肯定会采用第二种方法。以下是documentation所说的内容:
单表UPDATE分配通常从左到右进行评估 对。对于多表更新,无法保证 作业按任何特定顺序进行。
在你的情况下,目前很好,因为只有一张桌子。但是,将来如果有人修改了此语句并添加了新的table
/ join
(假设它可以像使用table
一样正常工作),它将停止工作/给出不一致结果
因此,出于可读性/可维护性的目的,请继续使用第二种方法。 (另外,我建议将update
语句包装到transaction
以保留atomicity)
答案 1 :(得分:2)
如果从表中访问要在表达式中更新的列,
UPDATE
将使用列的当前值。例如,以下语句将col1
设置为比其当前值多一个:UPDATE t1 SET col1 = col1 + 1;
以下语句中的第二个赋值将
col2
设置为当前(更新的)col1
值,而不是原始col1
值。结果是col1
和col2
具有相同的值。此行为与标准SQL不同。UPDATE t1 SET col1 = col1 + 1, col2 = col1;
单表
UPDATE
作业通常从左到右进行评估。对于多表更新,无法保证以任何特定顺序执行分配。
在您的情况下,使用单一陈述应该没问题。