模式下的MySQL删除

8 浏览
0 Comments

模式下的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。您正在使用安全更新模式,并且尝试更新一个没有使用关键列的WHERE的表。要禁用安全模式,请在首选项-> SQL Editor中切换选项并重新连接。0.000秒

我认为禁用安全更新不是一个好主意。关闭保存模式在这里找到答案 也许有其他的解决方案。有什么想法吗?

添加虚拟条件!= \'\' ,删除工作

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

选择*from session;

虚拟条件,例如Id IS NOT NULL或Id IN(“some_dummy_id_here”)不起作用

感谢@ tim-biegeleisen的帮助!

admin 更改状态以发布 2023年5月20日
0
0 Comments

或许您可以尝试向 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;

0