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

我试着写一些查询,但无论我try 什么,似乎都不起作用.

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行附近使用的正确语法

And also some of my keywords are highlighted: enter image description here

我不习惯写普通的SQL,因为我只在后台使用ORM.

推荐答案

documentation个国家:

在存储程序中,可以使用整数值 routine 参数或局部变量指定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;

SELECTIF是不必要的.LIMIT接受偏移量(只要它在SELECT中),所以您只需将其偏移量SELECT,然后通过id重新连接回来.

CREATE EVENT delete_old_rows
ON SCHEDULE EVERY 1 MINUTE
DO
  BEGIN
    DELETE FROM article
      WHERE article_type_id = 2
        AND id IN (
          SELECT a.id
          FROM article a
          ORDER BY a.id
          LIMIT 100, 1000000000
        );
  END;

请注意,偏移DESC略有不同,因为它将忽略first DESC而不是最后一个.如果这是个问题,那就把它排序为DESC而不是ASC.

Mysql相关问答推荐

同一类型对象之间的多对多关系

MySQL查询基于上次访问时间戳更新用户的问题

当日期附加到MySQL后,如何按日期说明排序?

在MySQL中查找包含无效正则表达式的行

如何在 MySQL 中对同一个表的多个列进行 INNER JOIN

将 Cloud Function (nodejs) 连接到 CloudSQL mySQL 数据库

SQL - 基本的内部连接查询

使用来自另一个表 mysql 的值将新行插入到表中

mysql数据库数据文件夹中的DESKTOP-7JFP5MF-bin.000001文件有什么用?

MySQL - 单词边界的正则表达式,不包括下划线(连接标点符号)

如何获取从开始时间到结束时间的所有正在运行的作业(job)的总和?

Golang Gorm没有从关联表中检索数据

WHERE SQL 语句中的列顺序是否重要

是否可以从 .SQL 文件中计算表中的行数?

如何在 SQL 的计算列中显示小数点后两位?

动态创建内联 SQL 表(用于排除左连接)

授予用户对 MySQL 中有限数量表的访问权限

计算执行的查询数

从 MySQL 中的日、月、年字段创建日期

在 MySQL 的 LIMIT 子句中使用变量