nih*_*lon 4 primary-key update errors mysql-5.6
什么会导致以以下开头的错误 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;
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
嗯,这很简单。
您已启用安全更新模式(如错误所述)。你的语句有一个 where 子句,对。但它被解释为 a JOIN
not as ,WHERE
因为您提供了类似 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;
Run Code Online (Sandbox Code Playgroud)
在技术上与此相同(并如此解释):
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;
Run Code Online (Sandbox Code Playgroud)
这意味着,没有真正的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;
Run Code Online (Sandbox Code Playgroud)
无论如何,您的 mysql 服务器正在运行,mysqld --safe-updates
或者mysqld --i-am-a-dummy
是完全相同的选项。
您可以使用以下命令之一检查是否真的启用了此功能:
SELECT @@SQL_SAFE_UPDATES
-- or
SHOW VARIABLES LIKE 'sql_safe_updates'
Run Code Online (Sandbox Code Playgroud)
顺便说一下,您也可以尝试一种解决方法来完成更新。Safe Update Mode
需要一个WHERE
或一个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;
Run Code Online (Sandbox Code Playgroud)
如果Safe Update Mode
启用了 ,您也需要注意DELETE
's。他们两者都需要。一个WHERE
和一个LIMIT
。请参阅文档。
归档时间: |
|
查看次数: |
4142 次 |
最近记录: |