【问题标题】:MySQL / MariaDB - Remove all but last record per day from databaseMySQL / MariaDB - 从数据库中删除除最后一条记录外的所有记录
【发布时间】:2020-08-22 22:08:30
【问题描述】:

我正在使用 MariaDB,并希望定期从我的数据库中清除记录,每天只保留数据库中的最后一条记录,因此超过 7 天将只剩下 7 条记录。

我发现了类似于我想做的事情here

DELETE FROM `table` WHERE id NOT IN (   SELECT id   FROM (
  SELECT id
  FROM `table`
  ORDER BY id DESC
  LIMIT 1   ) foo );

这会删除除最后一条记录之外的所有记录,但我想要一些每天都会留下最后一条记录的东西,所以我每天都有最新的条目。该解决方案不必重复过去,我可以每天在午夜运行它来处理前一天。

我有一个名为“stamp”的列,它是一个时间戳列。

【问题讨论】:

  • 顺便说一句,对于这种事情,创建一个只保留您想要保留的数据的新表,然后删除旧表并重命名新表通常会更快。
  • 为什么我的问题是-1?我是新手,寻求帮助。不需要。

标签: mysql mariadb


【解决方案1】:

如果表格大小不小,速度会快得多:

CREATE TABLE new LIKE tbl;
INSERT INTO new
    SELECT * FROM tbl WHERE ... ORDER BY ... LIMIT 1;
RENAME TABLE tbl TO old,
             new TO tbl;
DROP TABLE old;

奖励:tbl 在整个过程中可用。也就是说,没有停机时间。

那个和其他删除提示:http://mysql.rjweb.org/doc.php/deletebig

【讨论】:

    【解决方案2】:

    如果你有一个日期/日期时间字段,那么你可以这样做:

    DELETE a FROM `table` a INNER JOIN `table` b on (date_format(a.date, '%Y-%m-%d') = date_format(b.date, '%Y-%m-%d') and a.id < b.id)
    

    我使用的是 myorders 表而不是表,但看起来几乎相同:

    【讨论】:

    • 不使用 date_format,你可以只使用 date(a.date) 和 date(b.date)
    • 对不起,我不明白这个。为什么要引用 2 个表?我只有一个。
    • 这个是用来剔除小于同一个表中最大项的行,注意我用的表是同一个表,我是加入日期来匹配的,但是后来我是只消除小于 b.id 的行。
    • 如果您想查看哪些行将被删除,您只需将“DELETE a”更改为“SELECT a.*”,这将显示将被删除的行,以便您查看是否它可以对真实数据或您创建的一些测试数据执行您想要执行的操作。
    • #1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在 'table b on (date_format(a.date, '%Y-%m-%d') = date_format('%Y-%m-% d') 和 a.id
    【解决方案3】:

    试试这个。我已经从表中选择了具有今天日期的所有记录,并按降序排列,并保留第一个,即您的情况下的最新记录,并删除其余记录。此外,由于仅选择了具有今天日期的那些记录,因此保留了前一天的记录。 您可以修改日期部分以包含所需的日期。

    DELETE FROM table WHERE id=(SELECT id FROM table where DATE(tableDate)=CURDATE() ORDER BY id DESC OFFSET 1) AS SUBQUERY

    【讨论】:

    • 我收到了无法识别的“AS”声明。
    • @djmattc 试试这个然后DELETE FROM table WHERE id IN (SELECT id FROM table where DATE(tableDate)=CURDATE() ORDER BY id DESC OFFSET 1)
    • #1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“OFFSET 1)”附近使用正确的语法
    猜你喜欢
    • 2019-05-22
    • 2017-05-19
    • 2011-08-18
    • 2012-10-01
    • 2011-11-06
    • 2019-09-05
    • 2018-12-31
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多