Mysql

這種多表 DELETE…ORDER BY 的語法有什麼問題?

  • June 11, 2020

我有以下查詢:

DELETE proxies, pxpl FROM proxies
JOIN proxy_xref_proxy_list AS pxpl ON proxies.ID=pxpl.ProxyID
WHERE pxpl.DeactivationTS < (NOW() - INTERVAL 24 HOUR)
ORDER BY pxpl.ProxyListID, proxies.ID

需要排序以避免數據庫死鎖。但是,它會產生錯誤:

您的 SQL 語法有錯誤;檢查與您的 MariaDB 伺服器版本相對應的手冊,以在第 4 行的“ORDER BY pxpl.ProxyListID, proxies.ID”附近使用正確的語法

proxy_xref_proxy_list是一個多對多關係關聯表。

(Serge 自己回答了標題問題;這個答案試圖超越這個問題。)

如果死鎖是由多個執行緒執行的相同 DELETE引起的,則只需忽略死鎖;另一個執行緒將完成工作。

如果還有其他問題,可以使用子查詢代替 JOIN。甚至有一個額外的子查詢級別是您可能遇到的另一個錯誤的解決方法。

如果您有大量刪除,請參閱以下提示:http: //mysql.rjweb.org/doc.php/deletebig

顯然,根據文件ORDER BY,多刪除查詢不支持:

對於多表語法,DELETE 從每個 tbl_name 中刪除滿足條件的行。在這種情況下,不能使用 ORDER BY 和 LIMIT>。DELETE 還可以引用位於不同數據庫中的表;有關語法,請參見標識符限定符。

引用自:https://dba.stackexchange.com/questions/268878