gpt4 book ai didi

mysql - 通过 tressshold 时触发 (MySQL)

转载 作者:行者123 更新时间:2023-11-29 00:52:33 25 4
gpt4 key购买 nike

我有一个包含序列号(主键)、文本、日期的表

它经常插入一行。

我遇到的问题是我的表可能包含的行数不得少于 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; |

但首先我有语法错误,其次,我应该在最后一行之后执行此操作。

有人可以帮我把正确的方法和代码放在一起吗?

最佳答案

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。

关于mysql - 通过 tressshold 时触发 (MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7754036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com