【发布时间】:2019-10-18 10:20:35
【问题描述】:
我有一个 actor 表,如下所示:
| actor_id | first_name | last_name | last_update |
+----------+------------+-----------+---------------------+
| 1 | Jack | Nicholson | 2019-06-02 00:00:00 |
actor_id 列是自动递增的主键。
当我尝试像这样更新表格时:
UPDATE actor
SET last_name = 'foo'
WHERE last_update > '2019-06-02 00:00:00';
我被 MySQL 的安全更新模式阻止并出现此错误:
错误代码:1175。您正在使用安全更新模式,并且您尝试更新没有使用 KEY 列的 WHERE 的表。要禁用安全模式,请切换 Preferences -> SQL Editor 中的选项并重新连接。
确实last_update 列不是KEY 列,所以基于this SO answer 我想出了以下解决方法:
CREATE TEMPORARY TABLE IF NOT EXISTS ids AS (SELECT actor_id FROM actor WHERE last_update > '2019-06-02 00:00:00');
UPDATE actor
SET last_name = 'foo'
WHERE actor_id IN (SELECT actor_id FROM ids);
但我再次被 1175 错误阻止。
为什么安全更新模式在这里阻止了我?我可以在不禁用安全更新模式的情况下解决它吗?
【问题讨论】:
-
如果您知道该声明是正确的做法,只需禁用安全模式?如果你想要它,你可以在之后重新启用它。
-
谢谢。你这很务实,但不能完全回答我的问题:)
-
why 他们是否认为他们需要“保护”您免于执行错误(或缓慢)的 sql 语句?
-
@Luuk,因为初学者犯这种错误很常见,从错误中恢复可能需要很多工作。
-
我还要评论说,真正的专家并不讨厌这种事情,因为他们知道这有助于避免错误。 “专家是知道在他的学科中可能犯的一些最严重的错误以及如何避免这些错误的人。” ——维尔纳·海森堡