MySql 安全模式删除

Ole*_*leh 4 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);
Run Code Online (Sandbox Code Playgroud)

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

我不认为禁用安全更新是一个好主意。在此处关闭保存模式答案 也许还有其他解决方案。有任何想法吗 ?

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

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

从会话中选择 *;

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

感谢@tim-biegeleisen 的帮助!

Tim*_*sen 5

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

DELETE FROM session 
WHERE Id <> '' AND
      Id IN (SELECT * FROM (SELECT Id FROM session WHERE CreatedAt > NOW()) AS temp);
Run Code Online (Sandbox Code Playgroud)

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

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

SET SQL_SAFE_UPDATES = 0;
Run Code Online (Sandbox Code Playgroud)

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

SET SQL_SAFE_UPDATES = 1;
Run Code Online (Sandbox Code Playgroud)