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

标签 mysql sql triggers mysql-error-1442

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

触发SQL:

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字段 - 设置为触发器中的最后一条语句(代替 DELETE )。

最佳答案

不,你不能用触发器来做到这一点,这就是documentation说:

A stored function or trigger cannot modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger.

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

更新

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

关于MySql - 可以在 INSERT 触发器之后删除调用它的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44514671/

相关文章:

sql - 为什么我不能从此 View 中删除在 select 子句 (ORACLE) 中具有聚合函数的行?

c# - 如何循环 SQL 参数列表和 WHERE 子句?或者更有效地获得结果?

sql - 如何编写更新触发器以根据 SQL Server 2008 中另一个表中的值更新当前表?

sql - 如何创建触发器从另一个表数据更新表

php - 我需要帮助创建一个 php 脚本,该脚本将使用 html 表单过滤并显示 mysql 数据库的结果

php - 将查询数据保存到数组

sql - 使用批量加载从 postgres 中提取数据

jquery - 复选框单击事件被中断以运行代码,但 $.trigger ('click' ) 只能在 Chrome 中识别,而不能在 Firefox 中识别。为什么?

mysql - 如何最好地从 Java/JDBC 中的 SQL 查询中检索 SELECT COUNT(*) 的结果 - Long?大整数?

mysql - MySQL中选定的日期间隔