我使用的是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 中,如果 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 ;