MySql數(shù)據(jù)庫觸發(fā)器使用教程
一、介紹
1、觸發(fā)器是一種特殊的存儲過程。觸發(fā)器和存儲過程一樣,是一個能夠完成特定功能、存儲在數(shù)據(jù)庫服務(wù)器上的SQL片段,但是觸發(fā)器無語調(diào)用,當(dāng)對數(shù)據(jù)庫表中的數(shù)據(jù)執(zhí)行DML操作時自動觸發(fā)這個SQL片段的執(zhí)行,無需手動調(diào)用。
2、在MySql中,只有執(zhí)行insert,delete,update操作時才能觸發(fā)觸發(fā)器的執(zhí)行
3、觸發(fā)器的這種特性可以協(xié)助應(yīng)用在數(shù)據(jù)庫端確保數(shù)據(jù)的完整性,日志記錄,數(shù)據(jù)校驗(yàn)等操作
4、使用別名OLD和NEW來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,這與其他的數(shù)據(jù)庫是相似的,現(xiàn)在觸發(fā)器只支持行級觸發(fā),不支持語句級觸發(fā)
二、操作
1、表數(shù)據(jù)準(zhǔn)備
# 用戶表 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;
2、觸發(fā)器格式
# 創(chuàng)建只有一個執(zhí)行語句的觸發(fā)器 create trigger 觸發(fā)器名 before|after 觸發(fā)事件 on 表名 for each row 執(zhí)行語句; # 創(chuàng)建有多個執(zhí)行語句的觸發(fā)器 create trigger 觸發(fā)器名 before|after 觸發(fā)事件 on 表名 for each row begin 執(zhí)行語句列表 end;
3、操作
drop TRIGGER if EXISTS TRIGGER_test; -- 需求1:當(dāng)users表添加一行數(shù)據(jù),則會自動在user_log添加日志記錄 delimiter $$ CREATE TRIGGER TRIGGER_test after INSERT on users FOR EACH ROW BEGIN INSERT INTO user_log(content,create_time) VALUES('添加了一條數(shù)據(jù)',NOW()); end $$ delimiter ; INSERT INTO users(user_name,sex) VALUES('xiaohemaio','男'); -- 需求2:當(dāng)users表修改一行數(shù)據(jù),則會自動在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('修改了一條數(shù)據(jù)',NOW()); end $$ delimiter ; update users set user_name='迪麗熱巴' WHERE id=3;
三、觸發(fā)器NEW和OLD的使用
MySql中定義了NEW和OLD,用來表示觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù),來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容。
使用方法:NEW.columnName (columnName為相應(yīng)數(shù)據(jù)表某一列名)
1、案例
-- 案例一 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;
四、其他操作
-- 查看觸發(fā)器 SHOW TRIGGERS; -- 刪除觸發(fā)器 drop TRIGGER if EXISTS 觸發(fā)器名;
五、注意事項(xiàng)
1、觸發(fā)器中不能對本表進(jìn)行insert,update,delete操作,以免遞歸循環(huán)觸發(fā)
2、盡量少使用 觸發(fā)器,假設(shè)觸發(fā)器觸發(fā)每次執(zhí)行1s,insert table 500條數(shù)據(jù),那么就需要觸發(fā)500次觸發(fā)器,光是觸發(fā)器執(zhí)行的時間就花費(fèi)了500s,而insert 500條數(shù)據(jù)一共是1s,那么這個insert 的效率就非常低了。
3、觸發(fā)器是針對每一行的數(shù)據(jù),對增刪改非常頻繁的表上切記不要使用觸發(fā)器,因?yàn)榉浅O馁Y源。
補(bǔ)充:驗(yàn)證觸發(fā)器
向用戶表users插入數(shù)據(jù)。
mysql> INSERT INTO users (userName, password, name, nickName, sex, email, isManager) VALUE ('itbilu', 'e10adc3949ba59abbe56e057f20f883e', 'IT筆錄', 'itbilu', 1, 'cn.liuht@gmail.com', 0);
users原來沒有數(shù)據(jù),剛插入的數(shù)據(jù)userId為1。向用戶表角色表userRoles插入數(shù)據(jù),使觸發(fā)器觸發(fā):
mysql> INSERT INTO userRoles (userId, roleId) VALUE (1, 1);
剛才插入的數(shù)據(jù)已經(jīng)使觸發(fā)器觸發(fā),查看結(jié)果如下:
mysql> select isManager from users; +-----------+ | isManager | +-----------+ | 1 | +-----------+
總結(jié)
到此這篇關(guān)于MySql數(shù)據(jù)庫觸發(fā)器使用的文章就介紹到這了,更多相關(guān)MySql觸發(fā)器使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL在grant時報(bào)錯ERROR?1064?(42000)的原因及解決方法
網(wǎng)上查到的grant方式大多會報(bào)錯,主要原因是MySQL版本8.0后不能再使用原來的方式,這篇文章主要介紹了MySQL在grant時報(bào)錯ERROR?1064?(42000),需要的朋友可以參考下2022-08-08mysql的計(jì)劃任務(wù)與事件調(diào)度實(shí)例分析
這篇文章主要介紹了mysql的計(jì)劃任務(wù)與事件調(diào)度,結(jié)合實(shí)例形式分析了mysql計(jì)劃任務(wù)與事件調(diào)度相關(guān)概念、原理、用法與操作注意事項(xiàng),需要的朋友可以參考下2019-12-12mysql中的delete,drop和truncate有什么區(qū)別
這篇文章主要介紹了mysql中的delete,drop和truncate有什么區(qū)別,三者的用法和使用場景又完全不同,接下來我們來看看具體的區(qū)別吧,希望對你的學(xué)習(xí)有所幫助2022-06-06MySQL高性能實(shí)現(xiàn)Canal數(shù)據(jù)同步神器
本文主要介紹了MySQL高性能實(shí)現(xiàn)Canal數(shù)據(jù)同步神器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08