无法创建触发器 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。
这是我的代码
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。