觸發器的特性
- 需要MySQL 5
對觸發器的支持是在MySQL 5中增加的 - 僅支持表
只有表才支持觸發器,視圖不支持(臨時表也不支持)。 - 保持每個數據庫的觸發器名唯一
在MySQL 5中,觸發器名必須在每個表中唯一,但不是在每個數據庫中唯一。這表示同一數據庫中的兩個表可具有相同名字的觸發器。這在其他每個數據庫觸發器名必須唯一的DBMS中是不允許的,而且以后的MySQL版本很可能會使命名規則更為嚴格。因此,現在最好是在數據庫范圍內使用唯一的觸發器名。 - 觸發器失敗
如果BEFORE觸發器失敗,則MySQL將不執行請求的操作。此外,如果BEFORE觸發器或語句本身失敗,MySQL將不執行AFTER觸發器(如果有的的話) - BEFORE或AFTER
通常,將BEFORE用於數據驗證和凈化(目的是保證插入表中的數據確實是需要的數據)
觸發器的應用場景
需要在某個表發生更改時自動處理。
例如:
- 每當增加一個顧客到某個數據庫表時,都檢查其電話號碼格式是否正確,州的縮寫是否為大寫;
- 每當訂購一個產品時,都從庫存數量中減去訂購的數量;
- 無論何時刪除一行,都在某個存檔表中保留一個副本。
觸發器是MySQL響應以下任意語句而
自動執行的一條MySQL語句(或位於BEGIN和END語句之間的一組語
句):
DELETE;
INSERT;
UPDATE。
查看觸發器
- 圖形化工具(MySQL workBench)
- 終端
show triggers
刪除觸發器
DROP TRIGGER [trigger_name]
觸發器不能更新或覆蓋。為了修改一個觸發器,必須先刪除它,然后再重新創建。
創建觸發器
在創建觸發器時,需要給出4條信息:
唯一的觸發器名;
觸發器關聯的表;
觸發器應該響應的活動(DELETE、INSERT或UPDATE);
觸發器何時執行(處理之前或之后)。
通過出發條件和響應活動組合每張表最多可以創建6個觸發器
- 創建觸發器的語法如下
CREATE TRIGGER [trigger_name] [trigger_time] [trigger_event] ON [tb_name] FOR EACH ROW [trigger_stmt]
trigger_name:觸發器的名稱
tirgger_time:觸發時機,為BEFORE或者AFTER
trigger_event:觸發事件,為INSERT、DELETE或者UPDATE
tb_name:表示建立觸發器的表明,就是在哪張表上建立觸發器
trigger_stmt:觸發器的程序體,可以是一條SQL語句或者是用BEGIN和END包含的多條語句
- 創建有多個執行語句的觸發器
CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件
ON 表名 FOR EACH ROW
BEGIN
執行語句列表
END
其中,BEGIN與END之間的執行語句列表參數表示需要執行的多個語句,不同語句用分號隔開
- NEW和OLD的使用:
示例
- 用戶user表
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
`add_time` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`(250)) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1;
- 日志logs表
CREATE TABLE `logs` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`log` varchar(255) DEFAULT NULL COMMENT '日志說明',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志表';
- 觸發器
CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8;
DECLARE s2 VARCHAR(20) character set utf8;#后面發現中文字符編碼出現亂碼,這里設置字符集
SET s2 = " is created";
SET s1 = CONCAT(NEW.name,s2); #函數CONCAT可以將字符串連接
INSERT INTO logs(log) values(s1);
END;
效果演示
關於觸發器的進一步介紹
- 與其他DBMS相比,MySQL 5中支持的觸發器相當初級。未來的MySQL版本中有一些改進和增強觸發器支持的計划。
- 創建觸發器可能需要特殊的安全訪問權限,但是,觸發器的執行是自動的。如果INSERT、UPDATE或DELETE語句能夠執行,則相關的觸發器也能執行.
- 應該用觸發器來保證數據的一致性(大小寫、格式等)。在觸發器中執行這種類型的處理的優點是它總是進行這種處理,而且是透明地進行,與客戶機應用無關。
- 觸發器的一種非常有意義的使用是創建審計跟蹤。使用觸發器,把更改(如果需要,甚至還有之前和之后的狀態)記錄到另一個表非常容易
- MySQL觸發器中不支持CALL語句。這表示不能從觸發器內調用存儲過程。所需的存儲過程代碼需要復制到觸發器內
- 業務代碼VS觸發器?相對來說業務代碼更加容易維護,而觸發器速度更快.
參考博客:https://www.cnblogs.com/phpper/p/7587031.html
參考書籍:<<MySQL必知必會>>