Mysql
警告:為什麼即使沒有限制,帶有限制子句的語句也不安全?
由於 mysql 錯誤日誌中的一些警告,我有點惱火。範例 1:
[Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted. Statement: UPDATE `table` SET `status` = '1' WHERE `ID` = '15800' LIMIT 1
我的同事寫了這些語句,我一直想知道在使用顯式 ID 時限制語句的目的。儘管如此,不使用 LIMIT 也會出現此警告。
範例 2:
[Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted. Statement: DELETE FROM table WHERE id = 426888
在這種情況下可能有什麼問題?
你有沒有 ORDER BY 的 LIMIT。因此,它是沒有意義的。
沒有 ORDER BY 的集合沒有隱含的順序。錯誤消息告訴您:
這是不安全的,因為包含的行集無法預測
您的 DELETE 是否有帶有 LIMIT 的觸發器等?
這個問題讓我害怕的是,MySQL 沒有在錯誤的觸發級別報告問題。我在 2012 年 1 月 6 日之前寫過這個問題:有沒有人遇到過這個複制破壞錯誤?
我在過去的文章中寫道,錯誤報告顯示,截至 2010 年 12 月 10 日,觸發級別問題沒有出現在錯誤日誌中,而報告的問題似乎是原始 SQL。在您的情況下,您看到
DELETE FROM table WHERE id = 426888
並只是撓頭,問“世界上怎麼會認為如此簡單的 DELETE 語句不安全”?這個故事所講的道德
@gbn 的回答幫助您意識到您需要查看您的觸發器(@gbn 為 +1)。我想進一步揭示 MySQL 是如何在未正確記錄觸發器級別的錯誤中失手的。