首先,測試版本 Mysql 5.6。
然後再看觸發器的語法
CREATE [DEFINER = {user
| CURRENT_USER }] TRIGGERtrigger_name
trigger_time
trigger_event
ONtbl_name
FOR EACH ROWtrigger_body
trigger_time
: { BEFORE | AFTER }trigger_event
: { INSERT | UPDATE | DELETE }
這個是聯機文檔裡面查到的資料。其實語法也挺簡單。下面上栗子
首先我們先創建2個測試表
CREATE TABLE `test` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Col1` varchar(50) DEFAULT NULL, `Col2` varchar(50) DEFAULT NULL, `Col3` int(11) DEFAULT NULL, `Col4` float DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; CREATE TABLE `testTri` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Col1` varchar(50) DEFAULT NULL, `Col2` varchar(50) DEFAULT NULL, `Col3` int(11) DEFAULT NULL, `Col4` float DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
因為只是用於測試,結構上我就隨便建了,就創建一個自增列主鍵就ok了。
然後在testTri表創建一個觸發器(創建一個最簡單的觸發器奏是這樣子,簡單吧╮(╯_╰)╭)
drop trigger if exists TR_testTri; delimiter // create trigger TR_testTri after insert on testTri for each row begin insert into test(Col1,Col2,Col3,Col4) values (1,2,3,5); end// delimiter ;
然後再 testTri 上面添加一行記錄,明顯,很順利地,test表也增加了一行記錄。
insert into testTri (Col1,Col2,Col3,Col4) values (1,2,3,4);
結果 test 和 testTri 都寫入了一行的記錄。
正常的情況就寫到這裡了。當然羅 Insert 是這樣玩,Update/Delete 也是這樣玩, Before /After 在mysql 裡面也只是執行順序問題而已。
然後我就測試了集中情況。
1 觸發器自行遞歸,在表 testTri 創建一個觸發器,觸發內容就是往 testTri 寫入一條記錄。做一下實驗
drop trigger if exists TR_testTri; delimiter // create trigger TR_testTri after insert on testTri for each row begin insert into TR_testTri(Col1,Col2,Col3,Col4) values (1,2,3,5); end// delimiter ;
創建成功,語法上並沒有任何問題。然後添加一行記錄
insert into testTri (Col1,Col2,Col3,Col4) values (1,2,3,4);
然後華麗麗地報錯了。
insert into testTri (Col1,Col2,Col3,Col4) values (1,2,3,4) Error Code: 1442. Can't update table 'testtri' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 0.047 sec
所以驗證了不能自己遞歸自己。
2 2個表相互循環遞歸,在test 和 testTri 都創建一個觸發器,相互寫入數據
drop trigger if exists TR_testTri; delimiter // create trigger TR_testTri after insert on testTri for each row begin insert into test(Col1,Col2,Col3,Col4) values (1,2,3,5); end// delimiter ; drop trigger if exists TR_testTri2; delimiter // create trigger TR_testTri2 after insert on test for each row begin insert into testTri(Col1,Col2,Col3,Col4) values (1,2,3,6); end// delimiter ;
創建成功,語法上並沒有任何問題。然後添加一行記錄
insert into testTri (Col1,Col2,Col3,Col4) values (1,2,3,4);
然後華麗麗地又報錯了。
insert into testTri (Col1,Col2,Col3,Col4) values (1,2,3,4) Error Code: 1442. Can't update table 'testtri' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 0.047 sec
證明這種循環引用也是不被允許的。
做了一個這樣的簡單實驗。證明了mysql 在觸發器裡面不適宜玩太高級的邏輯,不然真的不知道到底錯誤是怎樣出現的。但是相對來說,對於程序的控制也會容易一些,也是有友好的一面~
PS:在下對Mysql 不甚熟練~還請大家指導