程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 關於Mysql 觸發器,Mysql觸發器

關於Mysql 觸發器,Mysql觸發器

編輯:MySQL綜合教程

關於Mysql 觸發器,Mysql觸發器


首先,測試版本 Mysql 5.6。

然後再看觸發器的語法

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    trigger_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 不甚熟練~還請大家指導

















  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved