MySql安全模式删除

Posted

技术标签:

【中文标题】MySql安全模式删除【英文标题】:MySql safe mode delete 【发布时间】:2017-11-30 10:36:10 【问题描述】:

我正在使用 mysql 5.7

DROP TABLE IF EXISTS `session`;
CREATE TABLE `session` (
`Id` varchar(128) NOT NULL,
`Browser` varchar(128) NOT NULL,
`IpAddress` varchar(128) NOT NULL,
`UserId` varchar(128) NOT NULL,
`CreatedAt` datetime DEFAULT NULL,
`ModifiedAt` datetime DEFAULT NULL,
`CreatedBy` varchar(256) DEFAULT NULL,
`ModifiedBy` varchar(256) DEFAULT NULL,
PRIMARY KEY (`Id`)
);


DELETE FROM session 
WHERE Id IN (SELECT * FROM (SELECT Id FROM session WHERE CreatedAt > NOW()) AS temp);

我收到一个错误:错误代码:1175。您正在使用安全更新模式,并且您尝试更新没有使用 KEY 列的 WHERE 的表 要禁用安全模式,请切换 Preferences -> SQL Editor 中的选项,然后重新连接。 0.000 秒

我不认为禁用安全更新是个好主意。关闭保存模式answers here 也许还有其他解决方案。有什么想法吗?

添加虚拟条件 !='' 并删除作品

DELETE FROM session 
WHERE Id !='' AND Id IN (SELECT * FROM (SELECT Id FROM session WHERE Browser = "Mozilla") AS temp);

从会话中选择 *;

像 Id IS NOT NULL 或 Id IN ("some_dummy_id_here") 这样的虚拟条件不起作用

感谢@tim-biegeleisen 的帮助!

【问题讨论】:

【参考方案1】:

也许您可以尝试在使用密钥的WHERE 子句中添加一个虚拟条件,例如

DELETE FROM session 
WHERE Id <> '' AND
      Id IN (SELECT * FROM (SELECT Id FROM session WHERE CreatedAt > NOW()) AS temp);

假设主键列Id始终不是空字符串,那么添加这个条件不会影响你的删除逻辑。

正如您所提到的,您还可以通过以下方式在会话中禁用安全模式:

SET SQL_SAFE_UPDATES = 0;

如果您偏执/谨慎,您甚至可以在执行删除查询后重新打开安全更新:

SET SQL_SAFE_UPDATES = 1;

【讨论】:

Id 是 PK。我试过“不为空”和“Id IN(“dummy_Id_here”)”不起作用 请贴出session的表结构。 用表格更新了问题。我们为 Id 使用 GUID,这就是为什么它是 varchar(128) 我很惊讶我的回答没有奏效。如果您阅读了here 的答案,您会看到一些答案暗示了我上面建议的技巧。 你认为 SET SQL_SAFE_UPDATES = 0;而不是删除查询和 SET SQL_SAFE_UPDATES = 1 ?

以上是关于MySql安全模式删除的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL的安全模式:sql_safe_updates介绍

mysql安全模式重置密码

mysql 安全模式

mysql 解除安全模式

sql MySQL禁用查询的安全更新模式

Mysql-解除安全模式批量更新