2017-06-05 101 views
0

我要做两个触发器,第一个,插入test1表后,插入test2表中的另一行。好的,问题是我必须以相反的格式做相同的触发器,插入行test2表后插入新行test1。我知道当触发器触发时触发器无法插入表中,但我需要解决这个问题。我没有很多触发器的经验,我希望这可以解决。MySQL双向触发

DELIMITER $$ CREATE TRIGGER `ai_test1_test2` AFTER INSERT ON `test1` 
FOR EACH ROW 
BEGIN INSERT INTO test2 (vtest2) VALUES (new.vtest1) 
END$$ 
DELIMITER ; 

双向触发:

DELIMITER $$ CREATE TRIGGER `ai_test2_test1` AFTER INSERT ON `test2` 
FOR EACH ROW 
BEGIN INSERT INTO test1 (vtest1) VALUES (new.vtest2) 
END$$ 
DELIMITER ; 

感谢。

编辑

无限循环不能得到解决。触发器不能是双向的...我认为我必须使用PROCEDURE ...

+1

不,这不可能被通过触发器和解决存在这是一个非常好的理由:它会冒无尽的循环(trigger1插入到table2中,触发trigger2,它插入到table1中,然后触发insert into table2 ...)。在应用程序逻辑或存储过程中更好地处理此问题。 – Shadow

+0

谢谢@Shadow,是的,循环是问题...... :(我认为每个触发器都是一个单独的执行程序,不能将另一个触发器动作称为第一个触发器动作... – dankkomcg

回答

0

有针对该问题的更多钞票的解决方案:

DELIMITER $$ CREATE TRIGGER `ai_test1_test2` AFTER INSERT ON `test1` 
FOR EACH ROW 
BEGIN 
    IF NOT EXISTS(SELECT vtest2 FROM test2 WHERE vtest2 = new.vtest1) THEN 
    INSERT INTO test2 (vtest2) VALUES (new.vtest1) 
    END IF; 
END$$ 
DELIMITER ; 

DELIMITER $$ CREATE TRIGGER `ai_test2_test1` AFTER INSERT ON `test1` 
FOR EACH ROW 
BEGIN 
    IF NOT EXISTS(SELECT vtest1 FROM test1 WHERE vtest1 = new.vtest2) THEN 
    INSERT INTO test1 (vtest1) VALUES (new.vtest2) 
    END IF; 
END$$ 
DELIMITER ; 
0

无限循环无法解析。触发器不能是双向的......我认为我必须使用PROCEDURE ...

+0

你没有解释你的*真实*问题,这是一个明显的[XY问题的例子](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) - 您使用触发器作为解决方案真正的问题,然后,你意识到你不能触发你想要的方式,因为这会创建一个无限循环。我对你的建议是编辑你的问题并解释*为什么*你想在第一个触发器我肯定有人会给你一个解决你真正问题的方法 – Mjh

+0

我必须要有表格,一个产品的CRM表格和产品的ERP表格...... 当我在CRM上添加产品时,必须在ERP表上重复;反过来,当产品在ERP上创建时这个产品必须在CRM桌面上创建......感谢@Mjh – dankkomcg

+0

Shadow建议什么似乎是解决这个问题的最简单和最快速的方法 - 只需在应用程序中执行它,这将是通过数据库实现的噩梦。您始终可以创建存储过程并检查哪个表需要重复记录,但是我个人认为从应用程序内部执行它会更容易。调试存储过程很困难,特别是如果您打算雇用额外的程序员,而这些程序员将来会在某个时间工作。在这种特殊情况下保持应用程序的应用程序逻话虽如此,我祝你好运! – Mjh