无法创建触发器 if-delete-clause

Cannot create trigger if-delete-clause

这是我的代码

CREATE TRIGGER free_tokens AFTER INSERT ON `csrf_token`
IF (SELECT COUNT(`csrf_token`.`id`)) > 5000 THEN
    DELETE FROM `csrf_token` WHERE `csrf_token`.`time` < (UNIX_TIMESTAMP(NOW() - INTERVAL 2 HOUR))
END IF;

检查插入后是否有超过 5000 个条目,然后删除所有超过 2 小时的条目

我得到 you have an error in your mysql syntax near IF (SELECT ... DELETE FROM ...

我正在使用 MariaDB,有人可以帮助我了解这个简单语句中的错误在哪里吗?

您的触发器定义缺少一些小东西:

  • 将MariaDB分隔符类型改为'//',这样触发指令就可以用分号分隔了
  • FOR EACH ROW,作为 MariaDB 触发器语法的一部分
  • 您的 DELETE 语句末尾缺少分号
  • 不能在 IF-THEN-ELSE 语句中嵌套查询
  • END 作为 MariaDB 语法的一部分,在其定义后分隔触发器的结尾

您的 IF 语句中嵌套查询的解决方法是定义一个变量,该变量将使用 SELECT 的结果进行更新,并在 IF 之前执行声明。

DELIMITER //

CREATE OR REPLACE TRIGGER free_tokens 
AFTER INSERT 
    ON `csrf_token` 
FOR EACH ROW
BEGIN
    DECLARE num_rows INT;
    SELECT 
        COUNT(*) INTO num_rows 
    FROM 
        `csrf_token`;
        
    IF num_rows > 5000 THEN 
        DELETE FROM 
            `csrf_token` 
        WHERE 
            `csrf_token`.`time` < (UNIX_TIMESTAMP(NOW() - INTERVAL 2 HOUR));
    END IF;
END//

DELIMITER ;

关于 MariaDB 触发器语法的更多信息 here