我有一个看起来很简单的MySQL表:
CREATE TABLE `logging` (
`id` bigint(20) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`level` smallint(3) NOT NULL,
`message` longtext CHARACTER SET utf8 COLLATE utf8_general_mysql500_ci NOT NULL
);
我想删除特定的所有行level,但最后一行除外(time是最新的)。
有没有一种方法可以选择level设置为特定值的所有行,然后在单个SQL查询中删除除最新行以外的所有行?我将如何开始解决这个问题?
(正如我所说,这是一个非常简化的表,所以请不要尝试讨论该表的可能的设计问题。我删除了一些列。它是根据PSR-3日志记录标准设计的,我认为没有一种简单的更改方法。我要解决的是如何从一个表中进行选择,然后删除同一表中除几行外的所有行。我只有MySQL的中级知识。)
谢谢您向正确的方向推我:)
编辑:
对于Linux on x86_64((Ubuntu)),数据库版本为/ usr / sbin / mysqld Ver 8.0.18-0ubuntu0.19.10.1
您可以使用ROW_NUMBER()分析功能(与使用数据库版本8+一样):
DELETE FROM `logging` AS lg
WHERE lg.`id` IN
( SELECT t.`id`
FROM
(
SELECT t.*,
ROW_NUMBER() OVER (ORDER BY `time` DESC) as rn
FROM `logging` t
-- WHERE `level` = @lvl -- optionally add this line to restrict for a spesific value of `level`
) t
WHERE t.rn > 1
)
删除除最后插入的行以外的所有行(考虑到id您的主键列)。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。