当前位置: 首页 > 知识库问答 >
问题:

MySQL-为什么安全更新模式阻止此更新命令?

羊舌富
2023-03-14
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
| 1        | Jack       | Nicholson | 2019-06-02 00:00:00 |

UPDATE actor
SET last_name = 'foo'
WHERE last_update > '2019-06-02 00:00:00';
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错误阻塞了。

为什么安全更新模式在这里阻止我?我可以在不禁用安全更新模式的情况下解决它吗?

共有1个答案

厉永宁
2023-03-14

您可以通过使列成为键列来解决此错误。换句话说,在列上创建一个索引(也称为键)。

mysql> set sql_safe_updates=ON;

mysql> UPDATE actor SET last_name = 'foo' WHERE last_update > '2019-06-02 00:00:00';
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

mysql> alter table actor add key (last_update);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> UPDATE actor SET last_name = 'foo' WHERE last_update > '2019-06-02 00:00:00';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0

错误的目的是防止在非索引列上有条件时无意锁定表中的每一行。

锁定的工作方式是锁定查询为测试条件而检查的所有行,而不仅仅是满足条件的所有行。如果您运行一个带有测试未索引查询的条件的查询,它必须检查表中的每一行,这可能比您预期的锁得多。

 类似资料:
  • null 错误代码:1175。您使用的是安全更新模式,并且试图更新一个没有使用键列的WHERE的表。要禁用安全模式,请在Preferences->SQL Editor中切换该选项并重新连接。 为什么安全更新模式停止第二个命令而允许第一个命令?

  • 与其他包管理器(如)相比,我发现当更新与给定项目相关的包时,有一种奇怪的行为。 还根据留档,和选项 根据composer.json将依赖项升级到最新版本,并更新composer.lock文件。 事实上,正确地更新了新的包版本号。但是没有被修改,并且列出了旧的版本过低的包。 为什么会发生这种情况?是我做错了什么,还是这就是应该怎么做的?如果是这样的话,为什么两个文件中的一个是最新的,而另一个不是最新

  • 本文向大家介绍MySQL 错误代码1175:安全更新,包括了MySQL 错误代码1175:安全更新的使用技巧和注意事项,需要的朋友参考一下 示例 尝试更新或删除记录而不包括WHERE使用该KEY列的子句时出现此错误。 要执行删除或更新-输入: 要再次启用安全模式,请输入:            

  • 我是java新手,所以请不要后悔java中的对象和东西正在传递引用的值,但下面是我试图传递对象的代码。当我通过传递到函数中更新值时,a的值没有改变。发生了什么请帮助我。。。

  • 我有一个Observable类,它在字符串变化时通知observer。在观察者的update方法中,更新的字符串可以打印到控制台。但是GUI没有相应的更新。为什么?

  • 我一直从mySQL收到这个错误消息 ”错误代码:1175。您正在使用安全更新模式,并且您试图更新一个没有使用KEY列的WHERE的表要禁用安全模式,请在首选项中切换选项- 我使用的查询是: 我确实在ID上有两个表的where子句,这两个表都是主键。 禁用SQL\u安全更新不是一个选项。 编辑:MySQL版本是v5。6.