【问题标题】:When updating multiple MySQL tables in one query, is assignment order always guaranteed?在一个查询中更新多个 MySQL 表时,是否始终保证分配顺序?
【发布时间】:2016-01-05 04:41:10
【问题描述】:

考虑在一个查询中更新表 A 和 B 的示例,其中 A.Column1 设置为 B.Column2(值“DEF”),然后 B.Column2 设置为值“XYZ”。是否始终保证分配顺序,以便 A.Column1 的值为“DEF”而不是“XYZ”?

SQL 示例:

UPDATE TableA a
JOIN TableB b ON b.Column0 = a.Column0
SET
    a.Column1 = b.Column2, -- Original value: "DEF"
    b.Column2 = 'XYZ'
WHERE a.Column0 = 123;

SELECT Column1 FROM TableA WHERE Column0 = 123; -- DEF or XYZ?

【问题讨论】:

  • 在 MySQL 中,您可能需要更新前触发器以使此行为在多表连接中可靠。

标签: mysql join sql-update


【解决方案1】:

值得注意的是the documentation on UPDATE对此非常清楚:

以下语句中的第二个赋值将 col2 设置为当前(更新的)col1 值,而不是原始 col1 值。结果是 col1 和 col2 具有相同的值。 此行为不同于标准 SQL。

令人惊讶的是,是的,秩序确实很重要并且受到尊重。不过,这似乎是一个古怪的 MySQL 东西,所以我不会过于依赖它,因为切换到另一个 RDBMS 会在它停止工作时引起相当大的混乱。

【讨论】:

  • 进一步查看文档,我发现了这个:Single-table UPDATE assignments are generally evaluated from left to right. For multiple-table updates, there is no guarantee that assignments are carried out in any particular order. 这会改变这个答案的正确性吗?
  • 出于这样的原因,在对这样的执行订单做出预期时,我一直非常谨慎。 MySQL 的古怪行为通常带有微妙的条件,使其不可预测。与往常一样,测试、测试并再次测试,以确保您做对了。
猜你喜欢
  • 2013-08-14
  • 2019-08-21
  • 2010-10-19
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 2010-11-18
  • 2010-11-26
相关资源
最近更新 更多