MySQL如何用触发器实现新增时删除最后一条数据
我这边有一张表用作数据缓冲区,每次仅保留前1000条记录,遇到2个小麻烦:如何用BEFORE触发器实现每次新增之前删除最后一条记录?如何用AFTER触发器实现每次查询之后...
我这边有一张表用作数据缓冲区,每次仅保留前1000条记录,遇到2个小麻烦:
如何用BEFORE触发器实现每次新增之前删除最后一条记录?
如何用AFTER触发器实现每次查询之后删除所查询都记录?
假设有表A(主键ID int,字段CONF varchar)
实例1:
每当触发INSERT事件前:
INSERT INTO TABLE_A VALUES(NULL,'NEW STRING');
都进行一次:
DELETE FROM TABLE_A ORDER BY ID ASC LIMIT 1;
实例2:
每当触发SELECT事件后:
SELECT CONF FROM TABLE_A ORDER BY ID ASC LIMIT 1;
都进行一次:
DELETE FROM TABLE_A ORDER BY ID ASC LIMIT 1; 展开
如何用BEFORE触发器实现每次新增之前删除最后一条记录?
如何用AFTER触发器实现每次查询之后删除所查询都记录?
假设有表A(主键ID int,字段CONF varchar)
实例1:
每当触发INSERT事件前:
INSERT INTO TABLE_A VALUES(NULL,'NEW STRING');
都进行一次:
DELETE FROM TABLE_A ORDER BY ID ASC LIMIT 1;
实例2:
每当触发SELECT事件后:
SELECT CONF FROM TABLE_A ORDER BY ID ASC LIMIT 1;
都进行一次:
DELETE FROM TABLE_A ORDER BY ID ASC LIMIT 1; 展开
4个回答
展开全部
首先mysql 只支持3种触发器
1 DELETE 2 INSERT 3 UPDATE
其他的MySQL语句不支持触发器,所以你第二个需求不能用触发器实现。
其次是 非常遗憾,MYSQL中触发器中不能对本表进行 insert ,update ,delete 操作,以免递归循环触发。所以你第一个需求不能在insert前删除本表数据
对于update 能用set 进行操作替换,insert与delete只能借助第二张表才能实现需要的目的。
1 DELETE 2 INSERT 3 UPDATE
其他的MySQL语句不支持触发器,所以你第二个需求不能用触发器实现。
其次是 非常遗憾,MYSQL中触发器中不能对本表进行 insert ,update ,delete 操作,以免递归循环触发。所以你第一个需求不能在insert前删除本表数据
对于update 能用set 进行操作替换,insert与delete只能借助第二张表才能实现需要的目的。
更多追问追答
追问
是否有其他解决方法?比如通过存储过程能否实现?
追答
用存储过程代价比较大,因为在存储过程中,不能判断几时插入数据,所以如果删除写在存储过程中,就不知道几时运行。如果你的表需要实时保持1000条数据,那样每时每刻运行存储过程压力也比较大。建议你缓存表建立两张一模一样的,就可以用触发器在插入数据的时候,删除另一张表的数据。然后在另一张表删除数据的时候再删除第一张表数据。这样就能保持同步
2018-09-20 · 百度知道官方认证企业
腾讯电脑管家
腾讯电脑管家是腾讯公司推出的免费安全管理软件,能有效预防和解决计算机上常见的安全风险,并帮助用户解决各种电脑“疑难杂症”、优化系统和网络环境,是中国综合能力最强、最稳定的安全软件。
向TA提问
关注
展开全部
我做了一个测试,这样在删除记录时报错,而不能删除,你看可不可以
delimiter $
create procedure rb()
begin
rollback;
end $
create trigger trigger1 before delete on table
for each now
begin
if old.xxx=XXX then
call rb ;
end if ;
end $
delimiter $
create procedure rb()
begin
rollback;
end $
create trigger trigger1 before delete on table
for each now
begin
if old.xxx=XXX then
call rb ;
end if ;
end $
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用delete 触发器格式:
CREATE trigger tri_update
on tablename
for delete
as
begin
--sql code
end
例:
CREATE trigger tri_update
on tablename1 --触发的表名
for delete
as
begin
declare @del_id varchar(40)
select @del_id = id from deleted --tablename1 中删除的数据保存在 deleted 中
delete tablename2 where id = @del_id --同步删除tablename2中数据
end
CREATE trigger tri_update
on tablename
for delete
as
begin
--sql code
end
例:
CREATE trigger tri_update
on tablename1 --触发的表名
for delete
as
begin
declare @del_id varchar(40)
select @del_id = id from deleted --tablename1 中删除的数据保存在 deleted 中
delete tablename2 where id = @del_id --同步删除tablename2中数据
end
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
MySQL的触发器不支持对本表操作的,你只能换种思路,在业务逻辑代码去处理这个事情,希望对你有帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |