2017-06-05 100 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