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

MySQL您正在使用安全更新模式,并且您试图更新一个没有WHERE的表

锺离鸿
2023-03-14

我一直从mySQL收到这个错误消息

”错误代码:1175。您正在使用安全更新模式,并且您试图更新一个没有使用KEY列的WHERE的表要禁用安全模式,请在首选项中切换选项-

我使用的查询是:

 UPDATE table1 a INNER JOIN table2 asa ON a.ID = asa.Table1Id SET a.ReferenceID = asa.ReferenceID WHERE a.ID > 0 AND asa.ID > 0 

我确实在ID上有两个表的where子句,这两个表都是主键。

禁用SQL\u安全更新不是一个选项。

编辑:MySQL版本是v5。6.

共有2个答案

许曦
2023-03-14

即使您正在使用KEYS,我猜KEYS没有正确使用。MySQL留档说。

如果启用了此变量,则不使用WHERE子句或LIMIT子句中的键的UPDATE和DELETE语句将产生错误。这使得可以捕获未正确使用键的UPDATE和DELETE语句,这些语句可能会更改或删除大量行。

即使在WHERE条件下,您下面的查询也会影响相同数量的行。我想ID的所有值都大于0对吗?如果是这样,那么这就是你出错的原因。

 UPDATE table1 a 
 INNER JOIN table2 asa 
 ON a.ID = asa.Table1Id 
 SET a.ReferenceID = asa.ReferenceID 
 --WHERE a.ID > 0 AND asa.ID > 0 

一种方法是按照建议SETSQL_SAFE_UPDATES=0;(禁用并尝试)。或者尝试改进WHERE条件。如果是单个表,也可以使用LIMIT

上官淮晨
2023-03-14

MySQL 5.6在执行UPDATE语句和JOIN

所以,与其

UPDATE table1 a
INNER JOIN table2 asa
ON a.ID = asa.Table1Id
SET a.ReferenceID = asa.ReferenceID
WHERE a.ID > 0 AND asa.ID > 0

您必须根据需要编写尽可能多的查询,例如:

UPDATE table1 a
SET a.ReferenceID = <The corresponding value in table 2>
WHERE a.ID = <The corresponding ID>

这对于类型来说非常烦人,可以使用动态SQL构建更新查询:

SELECT CONCAT('UPDATE table1 a SET a.ReferenceID = ', asa.ReferenceID, ' WHERE a.ID = ', t.ID, ';')
FROM table1 t
INNER JOIN table2 asa
ON t.ID = asa.Table1Id;

例如:

模式(MySQL v5.6)

CREATE TABLE test
(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    foo VARCHAR(255)
);

CREATE TABLE test2
(
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    id_test INT NOT NULL,
    foo VARCHAR(255),
    FOREIGN KEY (id_test) REFERENCES test(id)
);

INSERT INTO test (foo) VALUES ('hello'), ('world');

INSERT INTO test2 (id_test, foo) VALUES (1, 'bar'), (2, 'baz');

问题#1

SELECT CONCAT('UPDATE test t SET t.foo = ''', t2.foo, ''' WHERE t.id = ', t.id, ';') AS 'sql query'
FROM test t
INNER JOIN test2 t2
ON t.id = t2.id_test;

这将产生:

UPDATE test t SET t.foo = 'bar' WHERE t.id = 1;
UPDATE test t SET t.foo = 'baz' WHERE t.id = 2;

现在可以使用输出手动更新不同的行

DB-Fiddle视图

 类似资料:
  • 我试图调用一个存储过程,但我得到:错误代码:1175您正在使用安全更新模式,并且您试图更新一个没有使用键列的表 下面是表格: 程序如下: 我是这样称呼它的:

  • 但我又被1175错误阻塞了。 为什么安全更新模式在这里阻止我?我可以在不禁用安全更新模式的情况下解决它吗?

  • 医生总结(查看所有细节,运行): 颤动(频道稳定,v1.12.13 修补程序.8,在微软视窗(版本 10.0.18363.720)和区域设置 en-US) Android工具链 - 针对Android设备开发(Android SDK 版本 29.0.3)。 Android X 许可证状态未知。 请尝试重新安装或更新您的Android SDK 管理器。 请参阅Android Studio下载内容或访

  • 问题内容: 如何批量更新mysql数据?如何定义这样的事情: 具有一些值,例如: 和其他值: 也许用mysql是不可能的?一个PHP脚本? 问题答案: 在这种情况下,最简单的解决方案是使用构造。它的工作速度非常快,并且可以轻松完成工作。 或使用建筑

  • 我尝试删除table1中也出现在table2中的条目。code是table1和table2的主键。我使用以下查询: 但是,我得到了以下错误消息: 错误代码:1175。您正在使用安全更新模式,并且您尝试更新没有使用列的的表要禁用安全模式,请切换首选项中的选项- 但我的理解是,我已经将与列一起使用。 对此有什么建议吗?