1. TRIGGER簡介
trigger是mysql的觸發器,當建立觸發器時,會監控特定的事件,當觸發時會啟用物件,處理trigger_stmt,即要執行的語句。比如表的新增一條記錄時,你需要更新記錄的值得總和,則可以用trigger來實現。
2. Trigger建立語句
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
trigger_name:為觸發器名稱
trigger_time: 觸發器啟用時間,為BEFORE或AFTER, 表明在表資料處理之前或之後
trigger_event: 觸發啟用的類型:下面三種
INSERT:將新行插入表時啟用觸發程式,例如,通過INSERT、LOAD DATA和REPLACE語句。
UPDATE:更改某一行時啟用觸發程式,例如,通過UPDATE語句。
DELETE:從表中刪除某一行時啟用觸發程式,例如,通過DELETE和REPLACE語句。
tbl_name : 動作表名稱
trigger_stmt: 觸發器要操作的語句
3. 使用限制
1)同一個表不能有同一種觸發器:
例如,對於某一表,不能有兩個BEFORE UPDATE觸發程式。但可以有1個BEFORE UPDATE觸發程式和1個BEFORE INSERT觸發程式,或1個BEFORE UPDATE觸發程式和1個AFTER UPDATE觸發程式。
2)必須是永久表,不能是TEMPORARY表或視圖。
4. trigger使用
建立表和觸發器
CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;
NEW關鍵詞為操作後的新值。OLD表示操作之前的值。插入三行記錄,讀取@sum的值
mysql> SET @sum = 0;mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);mysql> SELECT @sum AS 'Total amount inserted';
返回值為 @sum的值是14.98 + 1937.50 – 100 = 1852.48。
對於觸發程式是多行,使用BEGIN ... END結構
mysql> delimiter //mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account -> FOR EACH ROW -> BEGIN -> IF NEW.amount < 0 THEN -> SET NEW.amount = 0; -> ELSEIF NEW.amount > 100 THEN -> SET NEW.amount = 100; -> END IF; -> END;//mysql> delimiter ;
更新一條記錄,查看值:
update account set acct_num = 241 where acct_num=141;
由於上面的update觸發了trigger,會使 amount的值設定為100.
5. 查看已經建立的trigger
show triggers
還可以在information_schema資料庫的 triggers表中查看。
6. 刪除觸發器
drop trigger test.ins_sum;
test為資料庫名,ins_sum為觸發器名稱
7. 對失敗的處理
· 如果BEFORE觸發程式失敗,不執行相應行上的操作。
· 僅當BEFORE觸發程式(如果有的話)和行操作均已成功執行,才執行AFTER觸發程式。
· 如果在BEFORE或AFTER觸發程式的執行過程中出現錯誤,將導致調用觸發程式的整個語句的失敗。
· 對於事務性表,如果觸發程式失敗(以及由此導致的整個語句的失敗),該語句所執行的所有更改將復原。對於非事務性表,不能執行這類復原,因而,即使語句失敗,失敗之前所作的任何更改依然有效。
地址:http://blog.csdn.net/yonggang7/article/details/24552817