MySql - 可以在AFTER INSERT触发器中删除调用它的行

时间:2017-06-13 07:15:11

标签: mysql sql triggers mysql-error-1442

让我用最简单的话来说 - 是否可以删除实际设置在触发器上的行即我有一个AFTER INSERT ON <table2>触发器,触发器中的SQL { {1}} / INSERT另一个UPDATE(基于<table1>),最后趋向于删除(基本触发触发器的行)中的条目/行。

触发SQL:

WHERE

如果没有DELIMITER || DROP TRIGGER IF EXISTS trg_adddata_tmp || CREATE TRIGGER trg_adddata_tmp AFTER INSERT ON adddata_tmp FOR EACH ROW BEGIN IF EXISTS (SELECT * FROM adddata WHERE data_id = new.data_id AND account_name = new.account_name) THEN UPDATE adddata SET data_id = new.data_id, account_name = new.account_name, user_name = new.user_name, first_name = new.first_name, last_name = new.last_name WHERE data_id = new.data_id AND account_name = new.account_name; ELSE INSERT INTO adddata (data_id, account_name, user_name, first_name, last_name) VALUES(new.data_id, new.account_name, new.user_name, new.first_name, new.last_name); END IF; DELETE FROM adddata_tmp WHERE id = new.id; END; || (正好位于DELETE之上),触发器就可以正常工作 - 如果存在则END; UPDATE - INSERT语句会出现以下错误:

DELETE

顺便说一下,这个错误是不言自明的,但仍然想确定这是否可行 - 如果不是这样,可能是其他方式,即我希望Error Code: 1442 Can't update table 'adddata_tmp' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 表为空(或清理)(在adddata_tmp上将数据复制到主INSERT表)

我想到的一个想法是,使用adddata根据某个EVENT字段清除adddata_tmp - 它被设置为触发器中的最后一个语句(代替status)。

1 个答案:

答案 0 :(得分:1)

不,你不能用触发器执行此操作,这是documentation所说的内容:

  

存储的函数或触发器无法修改已经存在的表   被调用的语句用于(读或写)   功能或触发器。

如果adddata_tmp表一直需要为空,那么我根本不会写入触发器。相反,我建议在尝试将数据插入adddata的脚本/服务中移动adddata_tmp更新逻辑。

<强>更新

如果我们正在进行批量插入并且数据(在adddata_tmp表中)没有在其他任何地方使用,那么我们可以编写一个cron作业来清理表(即每隔10分钟执行一次) 。此外,在这种情况下,TRUNCATE会更有效(而不是DELETE)。