我有 2 个类似的表,例如 A 和 B。我想将 A 中的插入复制到 B,并将 B 中的插入复制到 A 以集成两个用户系统。我在每个上都配置了“插入触发器后”。例子:
DELIMITER $$
CREATE DEFINER = `root`@`localhost` TRIGGER
`after_A_INSERT`
AFTER INSERT ON `A`
FOR EACH ROW BEGIN
INSERT INTO `B`
SET `id` = NEW.`id`,`name` = NEW.`name`;
END$$
DELIMITER ;
DELIMITER $$
CREATE DEFINER = `root`@`localhost` TRIGGER
`after_B_INSERT`
AFTER INSERT ON `B`
FOR EACH ROW BEGIN
INSERT INTO `A`
SET `id` = NEW.`id`,`name` = NEW.`name`;
END$$
DELIMITER ;
如果我在 A 中插入,触发器会在 B 中调用插入,但是此插入会在 B 中执行触发器,并且会发生死锁,从而避免无限循环。
我尝试在执行 INSERT 之前编辑触发器以 DROP 另一个表触发器,然后在它之后再次创建它。例子:
DELIMITER $$
CREATE DEFINER = `root`@`localhost` TRIGGER
`after_B_INSERT`
AFTER INSERT ON `B`
FOR EACH ROW BEGIN
DROP TRIGGER IF EXISTS `after_A_INSERT`;
INSERT INTO `A`
SET `id` = NEW.`id`, `name` = NEW.`name`;
/* And CREATE again here */
END$$
DELIMITER ;
但是,CREATE 是一种数据定义语言 (DDL) 语句,它会进行隐式提交。因此,这是无法做到的。
我试图用内部的 DROP 调用一个 PROCEDURE 来明确处理提交,但也不可能。
有什么建议可以镜像这两张桌子吗?
更新:使用Bill Karwin的 建议,我origin
向每个表添加了一个字段,其中包含各自的默认值A
或B
. 然后,我改变(DROP 和 reCREATE)触发器如下:
A中的触发:
...
BEGIN
IF NEW.`origin`='A' THEN
INSERT INTO `B`
SET `id` = NEW.`id`, `name` = NEW.`name`, `origin` = NEW.`origin`;
END IF;
END
在 B 中触发:
...
BEGIN
IF NEW.`origin`='B' THEN
INSERT INTO `A`
SET `id` = NEW.`id`, `name` = NEW.`name`, `origin` = NEW.`origin`;
END IF;
END