我正在尝试创建一个事件,删除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。
文档指出:
在存储的程序中,可以使用整数值例程参数或局部变量指定
参数。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;