我正在使用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的帮助!
答案 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;