【问题标题】:mysql delete earlier datas if max(id) - min(id) > 50,000如果 max(id) - min(id) > 50,000,mysql 删除早期数据
【发布时间】:2012-12-18 17:23:14
【问题描述】:

我有一个表,我需要将总行数保持在 50,000 以内。此表包含一个 Id 字段(id 是自动递增的)。

如何检查max(id) - min(id) > 50,000,然后删除之前的行?

DELETE FROM news WHERE if (max(id) - min(id) > 50000) 

如果max(id) - min(id) > 50000,这个query 将删除所有行,正确的方法是什么?理想情况下,我需要一个单行命令,以 SSH 方法为借口。谢谢。

【问题讨论】:

    标签: mysql sql ssh


    【解决方案1】:
    DELETE d 
    FROM news AS d
      JOIN
        ( SELECT MAX(id)-50000 AS lim 
          FROM news
        ) AS m
        ON d.id < m.lim ;
    

    当然,以上内容不会完全保留 50K 行,因为id 序列中可能存在间隙。但我想这是意料之中的,不是问题。如果您真的想保留 50K 行,那么任何语句的效率都可能会降低。你可以试试这个:

    DELETE d 
    FROM news AS d
      JOIN
        ( SELECT id AS lim 
          FROM news
          ORDER BY id DESC
          LIMIT 1 OFFSET 50000
        ) AS m
        ON d.id <= m.lim ;
    

    【讨论】:

    • 和我完全一样的答案......只是相差几秒钟...... :)
    • @ypercube:你的答案比 Jim 的快吗?
    • @ypercube 我知道你会很快...... :) ,+1 也回答你。嵌套查询慢就是这个原因。我说的对吗?
    • @Grijesh:测试它们并告诉我们:)
    • @ypercube 嵌套慢然后加入,我想这就是原因。
    【解决方案2】:
    DELETE FROM news 
    WHERE id NOT IN (SELECT id FROM news ORDER BY id DESC LIMIT 50000)
    

    【讨论】:

    • 我认为这是最佳答案+1
    • @Grijesh:为什么,因为它太慢了?
    • @ypercube 我不知道.. 它理解我!我只有这个理由。
    【解决方案3】:
    Delete from news where id < max(id)-50000
    

    【讨论】:

    • 这假定 id 是连续的。
    • 它给出的错误如下:“#1111 - 无效使用组函数”
    • @Pankaj,我得到了同样的错误“#1111 - 无效使用组函数”
    • 需要 max(id) 的子选择
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2016-11-17
    • 2020-01-24
    • 2021-04-12
    相关资源
    最近更新 更多