您好,登錄后才能下訂單哦!
這篇文章主要講解了“MySql數據庫觸發器如何使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MySql數據庫觸發器如何使用”吧!
1、觸發器是一種特殊的存儲過程。觸發器和存儲過程一樣,是一個能夠完成特定功能、存儲在數據庫服務器上的SQL片段,但是觸發器無語調用,當對數據庫表中的數據執行DML操作時自動觸發這個SQL片段的執行,無需手動調用。
2、在MySql中,只有執行insert,delete,update操作時才能觸發觸發器的執行
3、觸發器的這種特性可以協助應用在數據庫端確保數據的完整性,日志記錄,數據校驗等操作
4、使用別名OLD和NEW來引用觸發器中發生變化的記錄內容,這與其他的數據庫是相似的,現在觸發器只支持行級觸發,不支持語句級觸發
# 用戶表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for users -- ---------------------------- DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用戶名', `sex` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性別', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; # 用戶操作日志表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for user_log -- ---------------------------- DROP TABLE IF EXISTS `user_log`; CREATE TABLE `user_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, `create_time` datetime(0) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1;
# 創建只有一個執行語句的觸發器 create trigger 觸發器名 before|after 觸發事件 on 表名 for each row 執行語句; # 創建有多個執行語句的觸發器 create trigger 觸發器名 before|after 觸發事件 on 表名 for each row begin 執行語句列表 end;
drop TRIGGER if EXISTS TRIGGER_test; -- 需求1:當users表添加一行數據,則會自動在user_log添加日志記錄 delimiter $$ CREATE TRIGGER TRIGGER_test after INSERT on users FOR EACH ROW BEGIN INSERT INTO user_log(content,create_time) VALUES('添加了一條數據',NOW()); end $$ delimiter ; INSERT INTO users(user_name,sex) VALUES('xiaohemaio','男'); -- 需求2:當users表修改一行數據,則會自動在user_log添加日志記錄 drop TRIGGER if EXISTS TRIGGER_test1; delimiter $$ CREATE TRIGGER TRIGGER_test1 BEFORE UPDATE on users FOR EACH ROW BEGIN INSERT INTO user_log(content,create_time) VALUES('修改了一條數據',NOW()); end $$ delimiter ; update users set user_name='迪麗熱巴' WHERE id=3;
MySql中定義了NEW和OLD,用來表示觸發器的所在表中,觸發了觸發器的那一行數據,來引用觸發器中發生變化的記錄內容。
使用方法:NEW.columnName (columnName為相應數據表某一列名)
-- 案例一 drop TRIGGER if EXISTS TRIGGER_test2; delimiter $$ CREATE TRIGGER TRIGGER_test2 after INSERT on users FOR EACH ROW BEGIN INSERT INTO user_log(content,create_time) VALUES(CONCAT('添加的用戶信息為:',NEW.user_name,' 性別為:',NEW.sex ),NOW()); end $$ delimiter ; INSERT INTO users(user_name,sex) VALUES('xiaohemaio','男'); -- 案例二 drop TRIGGER if EXISTS TRIGGER_test3; delimiter $$ CREATE TRIGGER TRIGGER_test3 BEFORE UPDATE on users FOR EACH ROW BEGIN INSERT INTO user_log(content,create_time) VALUES(CONCAT('將:',OLD.user_name,' 修改為:',NEW.user_name ),NOW()); end $$ delimiter ; update users set user_name='迪麗熱巴' WHERE id=4; -- 案例三 drop TRIGGER if EXISTS TRIGGER_test4; delimiter $$ CREATE TRIGGER TRIGGER_test4 BEFORE DELETE on users FOR EACH ROW BEGIN INSERT INTO user_log(content,create_time) VALUES(CONCAT('將id為:',OLD.user_name,' 已刪除' ),NOW()); end $$ delimiter ; DELETE FROM users WHERE id=4;
-- 查看觸發器 SHOW TRIGGERS; -- 刪除觸發器 drop TRIGGER if EXISTS 觸發器名;
1、觸發器中不能對本表進行insert,update,delete操作,以免遞歸循環觸發
2、盡量少使用 觸發器,假設觸發器觸發每次執行1s,insert table 500條數據,那么就需要觸發500次觸發器,光是觸發器執行的時間就花費了500s,而insert 500條數據一共是1s,那么這個insert 的效率就非常低了。
3、觸發器是針對每一行的數據,對增刪改非常頻繁的表上切記不要使用觸發器,因為非常消耗資源。
向用戶表users插入數據。
mysql> INSERT INTO users (userName, password, name, nickName, sex, email, isManager) VALUE ('itbilu', 'e10adc3949ba59abbe56e057f20f883e', 'IT筆錄', 'itbilu', 1, 'cn.liuht@gmail.com', 0);
users原來沒有數據,剛插入的數據userId為1。向用戶表角色表userRoles插入數據,使觸發器觸發:
mysql> INSERT INTO userRoles (userId, roleId) VALUE (1, 1);
剛才插入的數據已經使觸發器觸發,查看結果如下:
mysql> select isManager from users; +-----------+ | isManager | +-----------+ | 1 | +-----------+
感謝各位的閱讀,以上就是“MySql數據庫觸發器如何使用”的內容了,經過本文的學習后,相信大家對MySql數據庫觸發器如何使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。