A と B など、2 つの同様のテーブルがあります。A への挿入を B に複製し、B への挿入を A に複製して、2 つのユーザー システムを統合したいと考えています。それぞれに「トリガーの挿入後」を構成しました。例:
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 し、その後にもう一度 CREATE しようとしました。例:
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 を呼び出そうとしましたが、それもできません。
この 2 つのテーブルをミラーリングするための提案はありますか?
更新: 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