1

让我用最简单的话说 -是否可以删除实际设置在触发器上的行,即我有一个AFTER INSERT ON <table2>触发器,触发器中的 SQL INSERT/UPDATE另一个<table1>(基于 a 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- withDELETE语句会出现以下错误:

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表)

我想到的一个想法是,使用 anEVENT来清理adddata_tmp基于某个字段的status字段 - 它被设置为触发器中的最后一个语句(代替DELETE)。

4

1 回答 1

1

不,您不能使用触发器执行此操作,这是文档中所说的:

存储的函数或触发器不能修改调用该函数或触发器的语句已经在使用(用于读取或写入)的表。

如果adddata_tmp表需要一直为空,那么我根本不会写触发器。相反,我建议adddata在尝试将数据插入到adddata_tmp.

更新

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

于 2017-06-13T07:27:20.050 回答