update join 中使用 order by 會導致 mysql 崩潰嗎?
在 mysql 中使用 update join 時加入 order by 會導致 mysql 崩潰的原因是,update 語句中的 join 不允許使用 order by。原因如下:
- update 語句與 order by 語句的邏輯沖突:update 語句用于更新一行或多行數據,而 order by 語句用于對結果集進行排序。在 update join 中,在 join 之后使用 order by 會導致 mysql 嘗試同時執行更新操作和排序操作,從而產生邏輯沖突。
- update 語句中不允許使用 order by:即使在不使用 join 的情況下,mysql 也明確規定 update 語句中不允許使用 order by。這是因為 update 語句的目的是修改數據,而不是返回結果集,而 order by 專門用于對結果集進行排序。
針對你提供的示例 sql 語句,崩潰的原因是:
在你的第二個 sql 語句中,使用了如下 order by 子句:
order by t1.push_status desc, t1.push_retry_times desc, t1.id asc
登錄后復制
這個 order by 子句試圖對更新后的結果集進行排序,而這是 update join 語句中不允許的。當 mysql 嘗試執行此語句時,就會導致崩潰。
解決方案:
要避免 mysql 在 update join 中使用 order by 導致崩潰,你可以使用子查詢或其他技術,例如:
使用子查詢:
UPDATE cfg_dev_network_push_status AS T1 SET T1.push_retry_times = T1.push_retry_times + 1, T1.push_status = '1', T1.push_end_time = '20231010141154002', T1.push_result = '1', T1.fail_reason = '109' WHERE T1.id IN ( SELECT T2.id FROM cfg_dev_network_bind_status AS T2 WHERE T2.del_flag = '0' AND T2.dev_id = 'theDevId' AND T2.status = '1' )
登錄后復制
使用其他技術:
你可以使用諸如存儲過程或觸發器等其他技術,在不使用 update join 中的 order by 的情況下實現類似的行為。