在一段时间后删除事件上的行

问题描述 投票:0回答:1

我正在尝试创建一个事件,删除article_type_id为2的文章,但前提是article_type_id为2的文章数量大于100(我想过滤掉我的旧文章,以便始终有100篇该类型的文章)数据库中有 2 个)

我尝试编写一些查询,但无论我尝试什么似乎都不起作用。

USE travemdb;

CREATE EVENT delete_old_rows
ON SCHEDULE EVERY 1 MINUTE
DO
  BEGIN
    DECLARE row_count INT;
    SELECT COUNT(*) INTO row_count FROM article WHERE article_type_id = 2;
    IF row_count >= 100 THEN
      DELETE FROM article WHERE article_type_id = 2 ORDER BY id LIMIT row_count - 100;
    END IF;
  END;

我希望它每1个月触发一次,这只是为了测试,但它不起作用。

我目前收到的消息是

错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,了解在第 5 行 '' 附近使用的正确语法

我的一些关键词也被突出显示:

我不习惯编写普通 SQL,因为我只在后端使用 ORM。

sql mysql events
1个回答
0
投票

文档指出:

在存储的程序中,可以使用整数值例程参数或局部变量指定

LIMIT
参数。

所以你不能使用计算的

LIMIT
参数。你需要预先计算一下。

CREATE EVENT delete_old_rows
ON SCHEDULE EVERY 1 MINUTE
DO
  BEGIN
    DECLARE row_count INT;
    SELECT COUNT(*) - 100
      INTO row_count
      FROM article
      WHERE article_type_id = 2;
    IF row_count > 0 THEN
      DELETE FROM article
        WHERE article_type_id = 2
        ORDER BY id
        LIMIT row_count;
    END IF;
  END;

但是

SELECT
IF
是不必要的。
LIMIT
接受偏移量,因此您可以将其偏移 100。

CREATE EVENT delete_old_rows
ON SCHEDULE EVERY 1 MINUTE
DO
  BEGIN
    DELETE FROM article
      WHERE article_type_id = 2
      ORDER BY id
      LIMIT 100, row_count;
  END;
© www.soinside.com 2019 - 2024. All rights reserved.