MySQL 觸發器的使用


MySQL 基礎篇

三范式

MySQL 軍規

MySQL 配置

MySQL 用戶管理和權限設置

MySQL 常用函數介紹

MySQL 字段類型介紹

MySQL 多列排序

MySQL 行轉列 列轉行

MySQL NULL 使用帶來的坑

MySQL AND 和 OR 聯合使用帶來的坑

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';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM