如何在mysql的同一张表中使用AFTER / BEFORE INSERT ON触发器之后更新表中的所有旧行?

时间:2019-04-11 18:50:13

标签: mysql triggers

在向该表中插入新行之前/之后,我需要将表的所有旧行的状态列更新为false。

我访问了这些网站,但没有解决我的查询。 MySQL - Trigger for updating same table after insert

DELIMITER $$
DROP TRIGGER update_old_status $$
CREATE TRIGGER update_old_status
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
    DECLARE MYCOUNTER INT;
    SELECT COUNT(*) INTO MYCOUNTER FROM table_name;

    IF (MYCOUNTER > 0) THEN
        UPDATE table_name SET status = false WHERE status = true;
    END IF;

END $$
DELIMITER ;

这是我的错误消息:

原因:java.sql.SQLException:无法更新存储函数/触发器中的表'table_name',因为调用该存储函数/触发器的语句已使用该表。

1 个答案:

答案 0 :(得分:1)

您不能使用触发器来更新触发器正在运行的同一表,因为创建无限循环的风险太大。

例如,插入触发器更新其表,该表在更新时运行另一个触发器,该触发器插入到同一表中,该表运行插入触发器...

您可以,也不需要使用触发器。相反,请使用事务并在将INSERT插入应用程序之前运行UPDATE。

伪代码:

START TRANSACTION;
UPDATE table_name SET status = false;
INSERT INTO table_name ...values...
COMMIT;