【发布时间】:2016-02-16 18:23:56
【问题描述】:
首先,我知道有很多相同类型的问题,但它们并没有解决我的问题!
如果给定的 2 列集合超过 10 行,我想删除最旧的行。我的触发器如下所示:
DELIMITER //
CREATE TRIGGER TEST_TRIGGER
AFTER INSERT
ON table1
FOR EACH ROW
BEGIN
SELECT COUNT(*)
INTO @Tcount
FROM table1
WHERE columnA = NEW.columnA
AND columnB = NEW.columnB;
IF @Tcount > 10 THEN
DELETE FROM table1
WHERE id in (select * from (select MIN(id) from table1 where columnA = NEW.columnA and columnB = NEW.columnB) as t);
END IF;
END;
//
DELIMITER;
我有一个文件中的触发器,当我执行它时抛出错误。完整的错误是
ERROR 1064 (42000) at line 25: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER' at line 1
第 25 行是包含 DELIMITER; 的最后一行
我的桌子是这样的:
CREATE TABLE `table1` (
`columnA` varchar(255) NOT NULL,
`columnB` varchar(255) NOT NULL,
`Version` varchar(255) NOT NULL,
`Build` int(11) DEFAULT NULL,
`Date` varchar(255) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
)
即使在引发错误后也会添加触发器。但是,当我将第 11 个条目(对于 columnA 和 columnB 的给定组合)添加到表中时,我收到以下错误:
ERROR 1442 (HY000): Can't update table 'table1' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
触发器中的select和delete语句在单独执行时很好,当然有适当的值。
MySQL 版本5.5.46
我会非常感谢任何更正/建议。
【问题讨论】:
-
请不要因为正确答案而改变您的问题。 Gwedoh 正确回答了您的问题,接受他的回答,然后为您的新问题打开一个新问题。 Stackoverflow 旨在成为未来用户的资源,并且更改您的问题以响应正确的答案会使将来的用户很难从您的问题中获得任何价值。
-
我已经在原始问题本身中提到了这两个问题。是的,我更改了我的问题标题,因为它具有误导性。您说我应该接受 Gwedoh 的回答是正确的,但这会给人一种问题已完全回答的印象。由于我期待更多的回应,所以我没有接受答案。
-
您需要在触发器之外运行该逻辑,因为触发器根本无法在当前操作的行之外修改基础表。根据此表的并发量,您可能希望在查询表时使用
SELECT ... ORDER BY recent_criteria LIMIT 10,并让维护作业定期清除旧行。 -
@JRD:谢谢,我明白我的问题了,我不能删除并插入同一个表!
标签: mysql mysql-error-1064 mysql-error-1442