MySQL 基礎篇
轉載:《Mysql中的觸發器》
什么是觸發器
觸發器(TRIGGER)是 MySQL 的數據庫對象之一,從5.0.2版本開始支持。該對象與編程語言中的函數非常類似,都需要聲明、執行等。但是觸發器的執行不是由程序調用,也不是由手工啟動,而是由事件來觸發、激活從而實現執行。有點類似 DOM 中的事件。
觸發器是由事件觸發,事件包括增,刪,改操作,當數據庫執行這些操作時,會激活觸發器執行相應的操作。
觸發器的語法
創建觸發器
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:插入某一行時激活觸發器,INSERT,LOAD DATA,REPLACE 語句可以觸發
- UPDATE:更改某一行時激活觸發器,UPDATE 語句可以觸發
- DELETE:刪除某一行時激活觸發器,DELETE,REPLACE 語句可以觸發
- tb_name:觸發器要執行的哪張表
- FOR EACH ROW:觸發頻率為每一行觸發一次
- trigger_stmt:觸發器的程序體,可以是一條SQL語句或者是用 BEGIN 和 END 包含的多條語句
創建只有一個執行語句的觸發器
CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件 ON 表名 FOR EACH ROW 執行語句;
創建有多個執行語句的觸發器
CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件 ON 表名 FOR EACH ROW BEGIN 執行語句列表 END;
MySQL 默認是以分號(;)作為結束執行符號,與觸發器執行語句列表中需要的分行起沖突,為解決此問題可用DELIMITER,如DELIMITER ;; ,就是將結束符號變成 ;;。
DELIMITER ;; CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件 ON 表名 FOR EACH ROW BEGIN 執行語句列表 END ;; DELIMITER;
刪除觸發器
DROP TRIGGER IF EXISTS tb_name;
示例
數據准備:
-- 創建user表 DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `account` varchar(255) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 創建對user表操作歷史表 DROP TABLE IF EXISTS `user_history`; CREATE TABLE `user_history` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `user_id` bigint(20) NOT NULL, `operatetype` varchar(200) NOT NULL, `operatetime` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
創建 user 表插入事件對應的觸發器
DROP TRIGGER IF EXISTS `tri_insert_user`; DELIMITER ;; CREATE TRIGGER `tri_insert_user` AFTER INSERT ON `user` FOR EACH ROW begin INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (new.id, 'add a user', now()); end ;; DELIMITER ;
創建 user 表更新事件對應的觸發器
DROP TRIGGER IF EXISTS `tri_update_user`; DELIMITER ;; CREATE TRIGGER `tri_update_user` AFTER UPDATE ON `user` FOR EACH ROW begin INSERT INTO user_history(user_id,operatetype, operatetime) VALUES (new.id, 'update a user', now()); end ;; DELIMITER ;
創建 user 表刪除事件對應的觸發器
DROP TRIGGER IF EXISTS `tri_delete_user`; DELIMITER ;; CREATE TRIGGER `tri_delete_user` AFTER DELETE ON `user` FOR EACH ROW begin INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (old.id, 'delete a user', now()); end ;; DELIMITER ;
至此,全部表及觸發器創建完成,開始驗證結果,分別做插入、修改、刪除事件,執行以下語句,觀察 user_history是否自動產生操作記錄。
INSERT INTO user(account, name, address) VALUES ('user1', 'user1', 'user1'); INSERT INTO user(account, name, address) VALUES ('user2', 'user2', 'user2'); UPDATE user SET name = 'user3', account = 'user3', address='user3' where name='user1'; DELETE FROM `user` where name = 'user2';