Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一个查询中更新多个MySQL表时,是否始终保证分配顺序?_Mysql_Join_Sql Update - Fatal编程技术网

在一个查询中更新多个MySQL表时,是否始终保证分配顺序?

在一个查询中更新多个MySQL表时,是否始终保证分配顺序?,mysql,join,sql-update,Mysql,Join,Sql Update,考虑在一个查询中更新表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'

考虑在一个查询中更新表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?
值得注意的是,这一点非常明确:

下面语句中的第二个赋值将col2设置为当前(更新的)col1值,而不是原始col1值。结果是col1和col2具有相同的值。此行为不同于标准SQL。
所以令人惊讶的是,是的,秩序确实重要,而且受到尊重。不过,这似乎是一个奇怪的MySQL问题,因此我不会过于依赖它,因为当它停止工作时,切换到另一个RDBMS会造成相当大的混乱。

进一步查看文档,我发现:
单表更新分配通常是从左到右计算的。对于多个表的更新,不能保证分配是以任何特定的顺序执行的。
这会改变这个答案的正确性吗?出于这样的原因,我在对执行顺序做出预期时一直非常谨慎。MySQL的古怪行为通常是有条件的,这使得它不可预测。和往常一样,反复测试,确保正确无误。在MySQL中,您可能需要一个更新前触发器,以便在多表联接中使此行为可靠。