开发者社区> 问答> 正文

删除数据库中除最后日期外的所有项目

我有一个看起来很简单的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

展开
收起
几许相思几点泪 2019-12-29 20:44:56 2788 0
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您的主键列)。

    2019-12-29 20:45:10
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载
云时代的数据库技术趋势 立即下载
超大型金融机构国产数据库全面迁移成功实践 立即下载