2013-07-26 39 views
0

如果我有兩個表A和B都帶有插入觸發器。MySQL鏈式觸發器

如果表A觸發器將一行插入到B中,則會在B觸發器觸發時執行更新?立即在插入或等待A觸發器完成?

使用僞僞代碼將是

A Trigger Starts 
    A Trigger Inserts Row into B 
    A Trigger Updates B 
A Trigger Ends 

B Trigger Fires (after insert) 

A Trigger Starts 
    A Trigger Inserts Row into B 
    B Trigger Fires (after insert) 
    A Trigger Updates B 
A Trigger Ends 
+1

爲什麼插入到然後upd ating B?你應該發佈,你實際上想要做什麼。我相信它可以用另一種方式解決。 – fancyPants

+0

它只是一個問題 - 如果事實證明觸發器A完成了第一次,我會有一個很好的小多米諾骨牌效應,通過一堆表更新 - 如果沒有,我會有一個潛在的混亂總是在災難邊緣搖搖欲墜。 –

回答

1

那麼你可能已經使用日誌表(general_log不會幫你這個),代碼檢查了它自己這樣

表的模式

CREATE TABLE a (id INT); 
CREATE TABLE b (id INT); 
CREATE TABLE c (id INT); 
DROP TABLE IF EXISTS tg_log; 
CREATE TABLE tg_log 
(
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    dt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    message VARCHAR(512) 
); 

觸發器

DROP TRIGGER IF EXISTS tg_a; 
DELIMITER $$ 
CREATE TRIGGER tg_a 
AFTER INSERT ON a 
FOR EACH ROW 
BEGIN 
    INSERT INTO tg_log(message) VALUES('tg_a START'); 
    INSERT INTO b VALUES (NEW.id); 
    INSERT INTO tg_log(message) VALUES('tg_a INSERT INTO b'); 
    UPDATE b SET id = id + 1 WHERE id = NEW.id; 
    INSERT INTO tg_log(message) VALUES('tg_a UPDATE b'); 
    INSERT INTO tg_log(message) VALUES('tg_a END'); 
END$$ 
DELIMITER ; 

DROP TRIGGER IF EXISTS tg_b; 
DELIMITER $$ 
CREATE TRIGGER tg_b 
AFTER INSERT ON b 
FOR EACH ROW 
BEGIN 
    INSERT INTO tg_log(message) VALUES('tg_b START'); 
    INSERT INTO c VALUES (NEW.id); 
    INSERT INTO tg_log(message) VALUES('tg_b INSERT INTO c'); 
    INSERT INTO tg_log(message) VALUES('tg_b END'); 
END$$ 
DELIMITER ; 

然後我們行插入表中

INSERT INTO a VALUES(1); 

這裏就是我們在出日誌中看到

+----+---------------------+--------------------+ 
| id | dt     | message   | 
+----+---------------------+--------------------+ 
| 1 | 2013-07-27 23:31:42 | tg_a START   | 
| 2 | 2013-07-27 23:31:42 | tg_b START   | 
| 3 | 2013-07-27 23:31:42 | tg_b INSERT INTO c | 
| 4 | 2013-07-27 23:31:42 | tg_b END   | 
| 5 | 2013-07-27 23:31:42 | tg_a INSERT INTO b | 
| 6 | 2013-07-27 23:31:42 | tg_a UPDATE b  | 
| 7 | 2013-07-27 23:31:42 | tg_a END   | 
+----+---------------------+--------------------+ 
7 rows in set (0.00 sec) 

這裏是SQLFiddle演示

+0

這很好,這意味着鏈式觸發器可以被認爲是嵌套的函數調用 - 爲我節省了一些時間,並且我學到了一些關於事務日誌的知識。 –