通过mysql中的trigger删除插入表中的同一行

时间:2014-06-17 08:20:14

标签: mysql sql triggers

我试图在插入临时表后删除一行,我收到此错误:

INSERT INTO `temp_program_counter` (`id`, `program_id`) values (NULL, '275')

无法在存储的函数/触发器中更新表'temp_program_counter',因为它已被调用此存储函数/触发器的语句使用。

这是我的触发器:

DELIMITER $$
DROP TRIGGER IF EXISTS `testtemp`$$

CREATE

    TRIGGER `testtemp` AFTER INSERT ON `temp_program_counter` 
    FOR EACH ROW BEGIN
        UPDATE `program` SET `view_count`=`view_count`+1;
        DELETE  FROM `temp_program_counter` WHERE id=new.id;
    END;
$$

DELIMITER ;

这个表是一个临时表,它有延迟获取数据,接收后必须更新主表并从temp中删除。 谢谢你提前帮忙。

2 个答案:

答案 0 :(得分:2)

您可能已经以某种方式解决了这个问题,但无论如何我都会发布答案:

您不能引用在触发器中触发触发器的同一个表(或触发器和存储过程的组合)。这可能意味着一个无限循环,因此sql通过提供该错误来阻止它,导致始终存在相同的错误。

答案 1 :(得分:0)

尝试插入之前 因为,您尝试删除刚刚插入但可能尚未在此会话中提交的记录。因此,您收到了错误。

如果您使用BEFORE INSERT,则会删除表中id = new.id的所有其他记录,并且将成功插入新记录。

DELIMITER $$
DROP TRIGGER IF EXISTS `testtemp`$$

CREATE

    TRIGGER `testtemp` BEFORE INSERT ON `temp_program_counter` 
    FOR EACH ROW BEGIN
        UPDATE `program` SET `view_count`=`view_count`+1;
        DELETE  FROM `temp_program_counter` WHERE id=new.id;
    END;
$$

DELIMITER ;