MySQL 插入触发器不适用于 INSERT INTO SELECT 语句

问题描述 投票:0回答:1

我使用的是MySql 8.0.35版本。就我而言,我有 3 个表,即 TBL1、TBL2 和 TBL3。我想使用TBL1和TBL2在TBL3中插入数据。

INSERT INTO TBL3 (..) SELECT T1.,T2, FROM TBL1 T1 INNER JOIN TBL2 T2 ON T1.id=T2.id;

我正在 TBL3 上创建一个 insert before 触发器,但不幸的是,当我执行 INSERT INTO ... SELECT 语句时它没有触发。

我们有其他解决方案吗?

mysql triggers
1个回答
0
投票

在 MySQL 中,如果 SELECT 语句没有从定义触发器的同一个表中进行选择,则不会为受 INSERT ... SELECT 语句影响的每一行触发触发器。此行为是为了防止无限循环而设计的。

如果您想根据 TBL1 和 TBL2 中的数据将数据插入到 TBL3 中,并且希望为插入到 TBL3 中的每一行触发触发器,您可能需要重新考虑您的方法。一种可能的解决方案是使用存储过程来实现所需的结果:

DELIMITER //

CREATE PROCEDURE insert_into_tbl3_from_tbl1_tbl2()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE id INT;
    DECLARE col1 VARCHAR(255);
    DECLARE col2 VARCHAR(255);

    DECLARE cur CURSOR FOR SELECT T1.id, T1.col1, T2.col2
                            FROM TBL1 T1
                            INNER JOIN TBL2 T2 ON T1.id = T2.id;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO id, col1, col2;
        IF done THEN
            LEAVE read_loop;
        END IF;
        INSERT INTO TBL3 (id, col1, col2) VALUES (id, col1, col2);
    END LOOP;
    CLOSE cur;
END//

DELIMITER ;
© www.soinside.com 2019 - 2024. All rights reserved.