【问题标题】:Trigger when tresshold is passed (MySQL)超过阈值时触发(MySQL)
【发布时间】:2011-10-13 12:22:21
【问题描述】:
我有一张带有序列号(主键)、文本、日期的表格
每隔一段时间就会插入一行。
我遇到的问题是我的表可能包含的行数不能少于 80 行且不超过 100。
我试着写点东西,但似乎我在做我不应该做的事情:
CREATE TRIGGER checkForInsertBelow80 BEFORE INSERT ON log FOR EACH ROW
BEGIN
IF (SELECT count(*) FROM log) >= 100 THEN
DELETE FROM log
WHERE serial in(SELECT serial from log order by serial ASC limit 10);
END IF
END; |
但首先我有语法错误,其次,我应该在最后一行之后执行此操作。
有人可以帮我把正确的方法和代码放在一起吗?
【问题讨论】:
标签:
mysql
database
stored-procedures
【解决方案1】:
1- 存储过程中的每个语句都必须以; 结束。
2- 可以简化删除语句。
3- 但是,您不能在触发器内更改同一个表,您只能更改触发器内的其他表。
解决方案
使用黑洞表并插入其中,黑洞将您的数据插入日志表,或在需要时删除日志条目。
CREATE TABLE bh_log (
id integer null default null,
field1 varchar(255) not null,
other fields....
) ENGINE = BLACKHOLE;
现在根据需要向黑洞表添加触发器。
您需要一个 INSERT 触发器,UPDATES 和 DELETES 是在原始日志表上完成的。
DELIMITER $$
CREATE TRIGGER ai_bh_log_each AFTER INSERT ON bh_log FOR EACH ROW
BEGIN
DECLARE log_count INTEGER;
INSERT INTO log VALUES (NEW.id, NEW.field1, NEW......);
SELECT count(*) INTO log_count FROM log;
IF log_count > 100 THEN
//Delete the oldest entry
DELETE FROM log WHERE log.id IS NOT NULL ORDER BY id ASC LIMIT 1;
END IF;
END $$
DELIMITER ;
由于触发器会针对您插入的每一行触发,因此您只需在每个触发器中删除 1 行即可 100% 使总行数永远不会超过 100。