首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除内部插入触发器

删除内部插入触发器
EN

Database Administration用户
提问于 2018-09-25 09:30:25
回答 2查看 3.3K关注 0票数 1

我希望在日志表中进行旋转,只存储最后100行,并决定使用触发器,如

代码语言:javascript
复制
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

EN

回答 2

Database Administration用户

发布于 2018-09-25 10:07:00

不能在触发器中更改相同的表。

使用旋转(更新最老的记录)而不是添加和删除。将100条记录插入您的表中(如果表中没有索引记录),并使用它们的时间戳。

代码语言:javascript
复制
UPDATE logs
SET field1=value1, field2=value2 -- , ...
ORDER BY record_timestamp ASC
LIMIT 1;

记录计数将始终保持不变。要增加它,只需在很久以前添加时间戳所需的记录量,以减少-删除您不需要的最旧记录的数量。

你根本不需要触发..。

票数 1
EN

Database Administration用户

发布于 2018-09-25 11:29:08

此时,我决定最好编写一个过程,而不是触发器:

代码语言:javascript
复制
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外部,能够将传递的值插入到表中。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/218484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档