电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

mysql觸發器trigger實例詳解

瀏覽:8日期:2023-10-05 09:23:55

MySQL好像從5.0.2版本就開始支持觸發器的功能了,本次博客就來介紹一下觸發器,首先還是談下概念性的東西吧:

什么是觸發器

觸發器是與表有關的數據庫對象,在滿足定義條件時觸發,并執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在數據庫端確保數據的完整性。

舉個例子,比如你現在有兩個表【用戶表】和【日志表】,當一個用戶被創建的時候,就需要在日志表中插入創建的log日志,如果在不使用觸發器的情況下,你需要編寫程序語言邏輯才能實現,但是如果你定義了一個觸發器,觸發器的作用就是當你在用戶表中插入一條數據的之后幫你在日志表中插入一條日志信息。當然觸發器并不是只能進行插入操作,還能執行修改,刪除。

創建觸發器

創建觸發器的語法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmttrigger_name:觸發器的名稱tirgger_time:觸發時機,為BEFORE或者AFTERtrigger_event:觸發事件,為INSERT、DELETE或者UPDATEtb_name:表示建立觸發器的表明,就是在哪張表上建立觸發器trigger_stmt:觸發器的程序體,可以是一條SQL語句或者是用BEGIN和END包含的多條語句所以可以說MySQL創建以下六種觸發器:BEFORE INSERT,BEFORE DELETE,BEFORE UPDATEAFTER INSERT,AFTER DELETE,AFTER UPDATE

其中,觸發器名參數指要創建的觸發器的名字

BEFORE和AFTER參數指定了觸發執行的時間,在事件之前或是之后

FOR EACH ROW表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器

創建有多個執行語句的觸發器

CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件ON 表名 FOR EACH ROWBEGIN 執行語句列表END

其中,BEGIN與END之間的執行語句列表參數表示需要執行的多個語句,不同語句用分號隔開

tips:一般情況下,mysql默認是以 ; 作為結束執行語句,與觸發器中需要的分行起沖突

為解決此問題可用DELIMITER,如:DELIMITER ||,可以將結束符號變成||

當觸發器創建完成后,可以用DELIMITER ;來將結束符號變成;

mysql> DELIMITER ||mysql> CREATE TRIGGER demo BEFORE DELETE -> ON users FOR EACH ROW -> BEGIN -> INSERT INTO logs VALUES(NOW()); -> INSERT INTO logs VALUES(NOW()); -> END -> ||Query OK, 0 rows affected (0.06 sec)mysql> DELIMITER ;

上面的語句中,開頭將結束符號定義為||,中間定義一個觸發器,一旦有滿足條件的刪除操作

就會執行BEGIN和END中的語句,接著使用||結束

最后使用DELIMITER ; 將結束符號還原

tigger_event:

mysql觸發器trigger實例詳解

load data語句是將文件的內容插入到表中,相當于是insert語句,而replace語句在一般的情況下和insert差不多,但是如果表中存在primary 或者unique索引的時候,如果插入的數據和原來的primary key或者unique相同的時候,會刪除原來的數據,然后增加一條新的數據,所以有的時候執行一條replace語句相當于執行了一條delete和insert語句。

觸發器可以是一條SQL語句,也可以是多條SQL代碼塊,那如何創建呢?

DELIMITER $ #將語句的分隔符改為$BEGINsql1;sql2;...sqlnEND $DELIMITER ; #將語句的分隔符改回原來的分號';'在BEGIN...END語句中也可以定義變量,但是只能在BEGIN...END內部使用:DECLARE var_name var_type [DEFAULT value] #定義變量,可指定默認值SET var_name = value #給變量賦值NEW和OLD的使用:mysql觸發器trigger實例詳解

根據以上的表格,可以使用一下格式來使用相應的數據:

NEW.columnname:新增行的某列數據OLD.columnname:刪除行的某列數據說了這么多現在我們來創建一個觸發器吧!

現在有表如下:

用戶users表

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=’日志表’;

需求是:當在users中插入一條數據,就會在logs中生成一條日志信息。

創建觸發器:

DELIMITER $CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROWBEGINDECLARE 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 $DELIMITER ;

這里我用的navicat:

mysql觸發器trigger實例詳解

查看觸發器SHOW TRIGGERS語句查看觸發器信息

mysql觸發器trigger實例詳解

Tip:

上面我用的navicat直接創建,如果大家用的mysql front,name這里會有個區別,我們刪除剛才的觸發器,在Mysql front中測試

drop trigger user_log;#刪除觸發器

打開Mysql Front:

mysql觸發器trigger實例詳解

mysql front在編譯sql時,不用定義結尾分隔符,修改后的sql直接這樣既可:

#DELIMITER $CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROWBEGINDECLARE 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 #$#DELIMITER ;mysql觸發器trigger實例詳解

這里再??錄婦洌?/p>

tips:SHOW TRIGGERS語句無法查詢指定的觸發器

在triggers表中查看觸發器信息

SELECT * FROM information_schema.triggers;

mysql觸發器trigger實例詳解

結果顯示了所有觸發器的詳細信息,同時,該方法可以查詢制定觸發器的詳細信息

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME=’user_log’;

tips:所有觸發器信息都存儲在information_schema數據庫下的triggers表中

可以使用SELECT語句查詢,如果觸發器信息過多,最好通過TRIGGER_NAME字段指定查詢

回到上面,我們創建好了觸發器,繼續在users中插入數據并查看數據:

insert into users(name,add_time) values(’周伯通’,now());

好吧,我們再來查看一下logs表吧!

mysql觸發器trigger實例詳解

通過上面的例子,可以看到只需要在users中插入用戶的信息,日志會自動記錄到logs表中,這也許就是觸發器給我帶來的便捷吧!

限制和注意事項

觸發器會有以下兩種限制:

1.觸發程序不能調用將數據返回客戶端的存儲程序,也不能使用采用CALL語句的動態SQL語句,但是允許存儲程序通過參數將數據返回觸發程序,也就是存儲過程或者函數通過OUT或者INOUT類型的參數將數據返回觸發器是可以的,但是不能調用直接返回數據的過程。

2.不能再觸發器中使用以顯示或隱式方式開始或結束事務的語句,如START TRANS-ACTION,COMMIT或ROLLBACK。

注意事項:MySQL的觸發器是按照BEFORE觸發器、行操作、AFTER觸發器的順序執行的,其中任何一步發生錯誤都不會繼續執行剩下的操作,如果對事務表進行的操作,如果出現錯誤,那么將會被回滾,如果是對非事務表進行操作,那么就無法回滾了,數據可能會出錯。

總結

觸發器是基于行觸發的,所以刪除、新增或者修改操作可能都會激活觸發器,所以不要編寫過于復雜的觸發器,也不要增加過得的觸發器,這樣會對數據的插入、修改或者刪除帶來比較嚴重的影響,同時也會帶來可移植性差的后果,所以在設計觸發器的時候一定要有所考慮。

觸發器是一種特殊的存儲過程,它在插入,刪除或修改特定表中的數據時觸發執行,它比數據庫本身標準的功能有更精細和更復雜的數據控制能力。

數據庫觸發器有以下的作用:

1.安全性。可以基于數據庫的值使用戶具有操作數據庫的某種權利。

# 可以基于時間限制用戶的操作,例如不允許下班后和節假日修改數據庫數據。

# 可以基于數據庫中的數據限制用戶的操作,例如不允許股票的價格的升幅一次超過10%。

2.審計。可以跟蹤用戶對數據庫的操作。

# 審計用戶操作數據庫的語句。

# 把用戶對數據庫的更新寫入審計表。

3.實現復雜的數據完整性規則

# 實現非標準的數據完整性檢查和約束。觸發器可產生比規則更為復雜的限制。與規則不同,觸發器可以引用列或數據庫對象。例如,觸發器可回退任何企圖吃進超過自己保證金的期貨。

# 提供可變的缺省值。

4.實現復雜的非標準的數據庫相關完整性規則。觸發器可以對數據庫中相關的表進行連環更新。例如,在auths表author_code列上的刪除觸發器可導致相應刪除在其它表中的與之匹配的行。

# 在修改或刪除時級聯修改或刪除其它表中的與之匹配的行。

# 在修改或刪除時把其它表中的與之匹配的行設成NULL值。

# 在修改或刪除時把其它表中的與之匹配的行級聯設成缺省值。

# 觸發器能夠拒絕或回退那些破壞相關完整性的變化,取消試圖進行數據更新的事務。當插入一個與其主健不匹配的外部鍵時,這種觸發器會起作用。例如,可以在books.author_code 列上生成一個插入觸發器,如果新值與auths.author_code列中的某值不匹配時,插入被回退。

5.同步實時地復制表中的數據。

6.自動計算數據值,如果數據的值達到了一定的要求,則進行特定的處理。例如,如果公司的帳號上的資金低于5萬元則立即給財務人員發送警告數據。

到此這篇關于mysql觸發器trigger實例詳解的文章就介紹到這了,更多相關mysql觸發器實例內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 拉曼光谱仪_便携式|激光|显微共焦拉曼光谱仪-北京卓立汉光仪器有限公司 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 一路商机网-品牌招商加盟优选平台-加盟店排行榜平台 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 泰来华顿液氮罐,美国MVE液氮罐,自增压液氮罐,定制液氮生物容器,进口杜瓦瓶-上海京灿精密机械有限公司 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 5nd音乐网|最新流行歌曲|MP3歌曲免费下载|好听的歌|音乐下载 免费听mp3音乐 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 网站建设-高端品牌网站设计制作一站式定制_杭州APP/微信小程序开发运营-鼎易科技 | 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 耐高温硅酸铝板-硅酸铝棉保温施工|亿欧建设工程| (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 无水硫酸铝,硫酸铝厂家-淄博双赢新材料科技有限公司 | 菏泽知彼网络科技有限公司| 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | hdpe土工膜-防渗膜-复合土工膜-长丝土工布价格-厂家直销「恒阳新材料」-山东恒阳新材料有限公司 ETFE膜结构_PTFE膜结构_空间钢结构_膜结构_张拉膜_浙江萬豪空间结构集团有限公司 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 集装箱展厅-住人集装箱住宿|建筑|房屋|集装箱售楼处-山东锐嘉科技工程有限公司 | 空气净化器租赁,空气净化器出租,全国直租_奥司汀净化器租赁 | 丙烷/液氧/液氮气化器,丙烷/液氧/液氮汽化器-无锡舍勒能源科技有限公司 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | 高压油管,液压接头,液压附件-烟台市正诚液压附件 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 北京乾茂兴业科技发展有限公司| MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | 顺辉瓷砖-大国品牌-中国顺辉| 西安文都考研官网_西安考研辅导班_考研培训机构_西安在职考研培训 | 阴离子聚丙烯酰胺价格_PAM_高分子聚丙烯酰胺厂家-河南泰航净水材料有限公司 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 双效节能浓缩器-热回流提取浓缩机组-温州市利宏机械 | 818手游网_提供当下热门APP手游_最新手机游戏下载 | 英超直播_英超免费在线高清直播_英超视频在线观看无插件-24直播网 | 水厂自动化|污水处理中控系统|水利信息化|智慧水务|智慧农业-山东德艾自动化科技有限公司 |