MySql安全模式删除

时间:2017-06-27 11:28:36

标签: mysql

我正在使用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的表要禁用安全模式,请切换首选项中的选项 - > SQL编辑器并重新连接。 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 个答案:

答案 0 :(得分:4)

也许你可以尝试在使用密钥的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;