【问题标题】:Is UPDATE guaranteed to execute the SET assignments in the given order? [duplicate]UPDATE 是否保证按给定顺序执行 SET 分配? [复制]
【发布时间】:2017-07-03 15:30:37
【问题描述】:

假设我们有一个表mytable,列有idab,并且有一行值(123, 'foo', 'bar')

我执行这个查询:

UPDATE mytable SET b=a, a='boom' WHERE id=123

我希望这两个分配按给定的顺序执行,因此结果行是(123, 'boom', 'foo'),但是这可以保证吗?

或者执行顺序是否未定义,因此理论上优化器可能出于某种原因决定以相反的顺序执行它们,最终会得到(123, 'boom', 'boom')

MySQL 文档没有明确说明分配是按照它们在查询中出现的顺序执行的。

【问题讨论】:

  • 我什么都不会假设,这可能会在未来发生变化,我讨厌它需要几秒钟来编写代码,分配两个值并在软件更新时返回并停止工作完成了。

标签: mysql


【解决方案1】:

Mysql UPDATE documentation

单表 UPDATE 分配通常从左到右进行评估。对于多表更新,不能保证以任何特定顺序执行分配。

为了安全起见,如果您使用另一列的值更新一列,我会将 UPDATE 语句拆分为单独的查询:

-- do all the fixed value updates here
UPDATE mytable SET a='boom', x='whatever' WHERE id=123; 
-- do "relational" updates here, after the values have been updated
UPDATE mytable SET b=a                    WHERE id=123;

【讨论】:

  • 如果您在多用户环境中这样做,您需要担心竞争条件。
猜你喜欢
  • 2014-07-22
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2022-09-27
相关资源
最近更新 更多