1、概念
觸發器(Trigger)是用戶定義在關係表上的一類由事件驅動的特殊過程,一旦定義,任何用戶
對錶的增、刪、改操作均由服務器自動激活相應的觸發器,在DBMS核心層進行集中的完整性控制。
2、定義觸發器
create trigger <觸發器名> before|after <觸發事件> on <表名>
for each row|statement [when <觸發條件>] <觸發動作體>
觸發事件:可以是 insert、delete 或 update ,可以是幾個事件的組合,用or連接
update 後面還可以有 of<觸發列,...>
觸發器類型:分爲 for each row(行級觸發器)和 for each statement(語句級觸發器,觸發一次)
觸發動作體:可以是一個過程塊或是對已創建存儲過程的調用,如果是行級觸發器,可以在過程體中
使用 new 和 old 引用 update/insert 事件之後的新值和 update/delete 事件之前的舊值
3、激活觸發器
同一個表上的多個觸發器激活時的執行順序:
1)執行該表上的 before 觸發器
2)激活觸發器的 SQL 語句
3)執行該表上的 after 觸發器
查看觸發器是否被激活:show triggers
4、刪除觸發器
drop trigger <觸發器名> on <表名>
5、mysql 觸發器實例
CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
);
DELIMITER | /* 改變輸入結束符 */
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END
|
DELIMITER ;
INSERT INTO test3 (a3) VALUES
(NULL), (NULL), (NULL), (NULL), (NULL),
(NULL), (NULL), (NULL), (NULL), (NULL);
INSERT INTO test4 (a4) VALUES
(0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
如果將下述值插入表test1,如下所示:
mysql> INSERT INTO test1 VALUES
-> (1), (3), (1), (7), (1), (8), (4), (4);
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0
那麼4個表中的數據如下:
mysql> SELECT * FROM test1;
+------+
| a1 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM test2;
+------+
| a2 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM test3;
+----+
| a3 |
+----+
| 2 |
| 5 |
| 6 |
| 9 |
| 10 |
+----+
5 rows in set (0.00 sec)
mysql> SELECT * FROM test4;
+----+------+
| a4 | b4 |
+----+------+
| 1 | 3 |
| 2 | 0 |
| 3 | 1 |
| 4 | 2 |
| 5 | 0 |
| 6 | 0 |
| 7 | 1 |
| 8 | 1 |
| 9 | 0 |
| 10 | 0 |
+----+------+
10 rows in set (0.00 sec)