Hello! 欢迎来到小浪云!


在MySQL中,UPDATE JOIN语句可以包含ORDER BY吗?


avatar
小浪云 2024-11-10 39

在MySQL中,UPDATE JOIN语句可以包含ORDER BY吗?

mysql中,使用update join时,带有order by会导致mysql崩溃吗?

在mysql中,不能在带有join的update语句中使用order by。这会导致mysql内部错误,甚至导致mysql崩溃。

原因

当update语句中包含join时,mysql将执行以下操作:

  1. 评估join条件,将匹配的记录分组。
  2. 对于每个匹配的组,执行update操作。

order by子句用于对结果集进行排序。但是,在带有join的update语句中,order by无法保证哪个组将首先被更新。这可能会导致mysql内部错误或崩溃。

修复方法

为了修复此问题,必须使用子查询或临时表来对记录进行排序:

使用子查询:

update cfg_dev_network_push_status t1 set ... where (t1.id, t1.push_status, t1.push_retry_times) in (     select id, push_status, push_retry_times     from (         select id, push_status, push_retry_times         from cfg_dev_network_push_status         join cfg_dev_network_bind_status on ...         order by push_status desc, push_retry_times desc, id asc     ) as subquery );
登录后复制

使用临时表:

CREATE TEMPORARY TABLE tmp_sort AS SELECT id, push_status, push_retry_times FROM cfg_dev_network_push_status JOIN cfg_dev_network_bind_status ON ... ORDER BY push_status DESC, push_retry_times DESC, id ASC;  UPDATE cfg_dev_network_push_status t1 SET ... WHERE (t1.id, t1.push_status, t1.push_retry_times) IN (     SELECT id, push_status, push_retry_times FROM tmp_sort );
登录后复制

相关阅读