我希望在日志表中进行旋转,只存储最后100行,并决定使用触发器,如
create trigger rotate_log
after insert on logs
for each row begin
declare
cnt int;
set cnt = (select count(*) from logs);
if cnt >100 then
delete from logs limit 1;
end if;
end但是,由于insert语句造成的死锁,它无法工作。那么,如何用更少的工作量来重写这个呢?
我正在为FreeBSD11.2 11.2使用mysql 15.1要闻10.1.35-MariaDB
发布于 2018-09-25 10:07:00
不能在触发器中更改相同的表。
使用旋转(更新最老的记录)而不是添加和删除。将100条记录插入您的表中(如果表中没有索引记录),并使用它们的时间戳。
UPDATE logs
SET field1=value1, field2=value2 -- , ...
ORDER BY record_timestamp ASC
LIMIT 1;记录计数将始终保持不变。要增加它,只需在很久以前添加时间戳所需的记录量,以减少-删除您不需要的最旧记录的数量。
你根本不需要触发..。
发布于 2018-09-25 11:29:08
此时,我决定最好编写一个过程,而不是触发器:
DELIMITER //
create PROCEDURE log_ins(usr varchar(50),msg text) begin
select count(*) into @cnt from logs;
if (@cnt > 10) then
delete from logs limit 1;
end if;
insert into logs(user, message) values (usr, msg);
end //它检查它是否超过了限制,如果是,它能够从表中删除一行,在if外部,能够将传递的值插入到表中。
https://dba.stackexchange.com/questions/218484
复制相似问题