在mysql中,使用update join時,帶有order by會導致mysql崩潰嗎?
在mysql中,不能在帶有join的update語句中使用order by。這會導致mysql內部錯誤,甚至導致mysql崩潰。
原因
當update語句中包含join時,mysql將執行以下操作:
- 評估join條件,將匹配的記錄分組。
- 對于每個匹配的組,執行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 );
登錄后復制