【问题标题】:SQL keep only the last X rowsSQL 只保留最后 X 行
【发布时间】:2022-01-12 16:04:57
【问题描述】:

我有一张表,其中 id 不断增加。 Id 并不总是增加相同的值,并且由于 api 而不是 auto_increment,但它会永久增加。示例:

Id other content
501 xxx
500 yyy
365 qqq
... ...

现在我只想保留最后 X 行,删除 ID 较低的行。我能够为自己找到一个类似但不是可行的解决方案来解决这个问题。

我认为这样的事情会起作用,但是有一个错误:

DELETE FROM `games` WHERE `matchId` NOT IN(SELECT `matchId` FROM `games` ORDER BY `matchId` DESC LIMIT X)

#1235 - 这个版本的 MySQL 还不支持 'LIMIT & IN/ALL/ANY/SOME 子查询'

我在 phpmyadmin 5.1.1 Web 界面上运行 mysql 版本 8.0.27。

有没有办法在不触发此错误的情况下保留最新的 x 行?

【问题讨论】:

    标签: mysql sql phpmyadmin


    【解决方案1】:
    WITH cte AS (
     SELECT id, ROW_NUMBER() OVER (ORDER BY id DESC) AS rownum FROM games
    )
    DELETE games FROM games JOIN cte USING (id) WHERE rownum > 2;
    

    【讨论】:

    • 对于可能尝试使用 MariaDB 的读者请注意:MariaDB 目前仅支持公共表表达式后跟 SELECT,不支持 DELETE。这是 MariaDB 和 MySQL 之间的许多不兼容问题之一。
    • 谢谢,为我工作!虽然 mysql 说 WITH 是未知语句,但除了 2 个条目之外的所有条目都已删除。
    • 我相信错误来自 phpmyadmin 解析器,而不是 MySQL。据说在phpadmin的mysql解析器版本5.5.0中修复,根据这个问题:github.com/phpmyadmin/sql-parser/issues/165
    【解决方案2】:

    您可以改用 CTE:

    with u as
    (select Id from table_name order by Id desc limit 5)
    delete from table_name
    where Id not in(select Id from u)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 2020-09-01
      • 2020-12-12
      • 2019-02-19
      • 2023-02-08
      相关资源
      最近更新 更多