Update

MySQL 1175 使用主鍵時出錯

  • July 4, 2015

什麼會導致以下列開頭的錯誤 1175 You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column...:。我遇到的問題是我確實包含了一個WHERE帶有關鍵列的子句:WHERE a.a_id = b.b_id

a_id並且b_id是各自表中唯一的關鍵列。

START TRANSACTION;
   UPDATE table_a a, table_b b
   SET a.update_me = b.update_from_me
WHERE a.a_id = b.b_id;
SELECT * FROM a;

我錯過了什麼?

嗯,這很簡單。

您已啟用安全更新模式(如錯誤所述)。您的語句有一個 where 子句,對。但它被解釋為 aJOIN而不是 aWHERE因為您提供了類似 a 的語法INNER JOIN

你的程式碼:

UPDATE table_a a, table_b b
SET a.update_me = b.update_from_me
WHERE a.a_id = b.b_id;

在技​​術上與此相同(並被解釋為這樣):

UPDATE a
FROM table_a a
INNER JOIN table_b b
       ON a.a_id = b.b_id;b_id
SET a.update_me = b.update_from_me;

這意味著,沒有真正WHERE的 . 您更新table_a與另一個表匹配的整個表table_b

如果您真的想實現這一點,您可以Safe Update Mode使用以下程式碼禁用此查詢:

SET SQL_SAFE_UPDATES=0;
UPDATE table_a a, table_b b
SET a.update_me = b.update_from_me
WHERE a.a_id = b.b_id;

無論如何,您的 mysql 伺服器正在執行mysqld --safe-updates或者mysqld --i-am-a-dummy幾乎是相同的選項。

您可以使用以下命令之一檢查這是否真的啟用:

SELECT @@SQL_SAFE_UPDATES
-- or
SHOW VARIABLES LIKE 'sql_safe_updates'

順便說一句,您還可以嘗試解決方法來完成更新。Safe Update Mode需要 aWHERE或 a LIMIT。這將限制更新的影響。另一個想法可以是LIMIT為您的UPDATE.

UPDATE table_a a, table_b b
SET a.update_me = b.update_from_me
WHERE a.a_id = b.b_id
LIMIT 100000;

如果Safe Update Mode啟用了,您也需要注意DELETE’。他們兩者都需要。一個WHERE和一個LIMIT。請參閱文件

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