update join 中使用 order by 會導(dǎo)致 mysql 崩潰嗎?
在 mysql 中使用 update join 時加入 order by 會導(dǎo)致 mysql 崩潰的原因是,update 語句中的 join 不允許使用 order by。原因如下:
- update 語句與 order by 語句的邏輯沖突:update 語句用于更新一行或多行數(shù)據(jù),而 order by 語句用于對結(jié)果集進(jìn)行排序。在 update join 中,在 join 之后使用 order by 會導(dǎo)致 mysql 嘗試同時執(zhí)行更新操作和排序操作,從而產(chǎn)生邏輯沖突。
- update 語句中不允許使用 order by:即使在不使用 join 的情況下,mysql 也明確規(guī)定 update 語句中不允許使用 order by。這是因?yàn)?update 語句的目的是修改數(shù)據(jù),而不是返回結(jié)果集,而 order by 專門用于對結(jié)果集進(jìn)行排序。
針對你提供的示例 sql 語句,崩潰的原因是:
在你的第二個 sql 語句中,使用了如下 order by 子句:
order by t1.push_status desc, t1.push_retry_times desc, t1.id asc
登錄后復(fù)制
這個 order by 子句試圖對更新后的結(jié)果集進(jìn)行排序,而這是 update join 語句中不允許的。當(dāng) mysql 嘗試執(zhí)行此語句時,就會導(dǎo)致崩潰。
解決方案:
要避免 mysql 在 update join 中使用 order by 導(dǎo)致崩潰,你可以使用子查詢或其他技術(shù),例如:
使用子查詢:
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' )
登錄后復(fù)制
使用其他技術(shù):
你可以使用諸如存儲過程或觸發(fā)器等其他技術(shù),在不使用 update join 中的 order by 的情況下實(shí)現(xiàn)類似的行為。