Mysql

警告:為什麼即使沒有限制,帶有限制子句的語句也不安全?

  • August 13, 2017

由於 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 是如何在未正確記錄觸發器級別的錯誤中失手的。

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