MySQL數(shù)據(jù)庫(kù)觸發(fā)器從小白到精通
先了解一下觸發(fā)器,再來(lái)討論是否能完全代替外鍵
什么是觸發(fā)器?
概念:觸發(fā)器(trigger)是SQL server 提供給程序員和數(shù)據(jù)分析員來(lái)保證數(shù)據(jù)完整性的一種方法,它是與表事件相關(guān)的特殊的存儲(chǔ)過(guò)程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件來(lái)觸發(fā),比如當(dāng)對(duì)一個(gè)表進(jìn)行操作( insert,delete, update)時(shí)就會(huì)激活它執(zhí)行。觸發(fā)器經(jīng)常用于加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等。 觸發(fā)器可以從 DBA_TRIGGERS ,USER_TRIGGERS 數(shù)據(jù)字典中查到。SQL3的觸發(fā)器是一個(gè)能由系統(tǒng)自動(dòng)執(zhí)行對(duì)數(shù)據(jù)庫(kù)修改的語(yǔ)句。
通俗的來(lái)講,觸發(fā)器就是一個(gè)觸發(fā)裝置,裝置里面存有一段操作。這個(gè)裝置有觸發(fā)條件,達(dá)到某個(gè)條件就會(huì)觸發(fā)這個(gè)裝置,觸發(fā)裝置就會(huì)執(zhí)行存儲(chǔ)的一段操作。
如何在數(shù)據(jù)庫(kù)中建立觸發(fā)器
建立觸發(fā)器實(shí)例(關(guān)鍵詞:trigger)
例一:建立一個(gè)用戶(hù)表(用戶(hù)ID,用戶(hù)姓名),建立一個(gè)觸發(fā)器(當(dāng)用戶(hù)表中插入數(shù)據(jù)時(shí),自動(dòng)生成一個(gè)全局唯一的ID)
先建立user表
create table user( id int PRIMARY KEY, name varchar(20) );
建立觸發(fā)器
-- 建立觸發(fā)器名為tt create TRIGGER tt -- 觸發(fā)條件,向user表中插入數(shù)據(jù)時(shí)啟動(dòng)觸發(fā)器 BEFORE insert on user -- 檢查表中每一行,對(duì)新插入的數(shù)據(jù)進(jìn)行操作 for EACH ROW -- 執(zhí)行操作 BEGIN set new.id=UUID(); END
剛剛建立的觸發(fā)器(查看當(dāng)前數(shù)據(jù)庫(kù)下全部觸發(fā)器的代碼show triggers)
效果:向表中插入三個(gè)用戶(hù)名,自動(dòng)生成三個(gè)ID
insert user(name) VALUE('張三'),('李四'),('王五')
例二:再建立一個(gè)訂單表DD(訂單ID,商品名稱(chēng),用戶(hù)ID),建立一個(gè)觸發(fā)器tq1(當(dāng)刪除一個(gè)用戶(hù)時(shí),該用戶(hù)的訂單也將刪除)
建表
create table DD( ddid int PRIMARY KEY, ddname VARCHAR(20), userid VARCHAR(50) )
建立觸發(fā)器
delimiter $ -- 建立觸發(fā)器名為tq create TRIGGER tq1 -- 觸發(fā)條件,再dd表刪除數(shù)據(jù)之后啟動(dòng)觸發(fā)器 AFTER DELETE on user -- 檢查表中每一行,對(duì)新插入的數(shù)據(jù)進(jìn)行操作 for EACH ROW -- 執(zhí)行操作 BEGIN DELETE FROM dd WHERE old.id=userid; END $ delimiter ;
向表中添加兩條數(shù)據(jù)
效果:刪除user表中的用戶(hù),dd表中的記錄也跟隨刪除
刪除張三
delete from user WHERE name='張三'
觸發(fā)器能否完全代替外鍵
- 上面的例二如果用外鍵也可以實(shí)現(xiàn)同樣的效果,那么是不是說(shuō)明外鍵可以做到的,觸發(fā)器都可以做到,外鍵做不到的觸發(fā)器也可以做到呢?
- 與外鍵相比,觸發(fā)器的靈活性更高功能更多,可以執(zhí)行更多功能在一定程度上可以代替外鍵,實(shí)現(xiàn)外鍵的功能。
- 觸發(fā)器也可用于強(qiáng)制引用完整性,以便在多個(gè)表中添加、更新或刪除行時(shí),保留在這些表之間所定義的關(guān)系。然而,強(qiáng)制引用完整性的最好方法是在相關(guān)表中定義主鍵和外鍵約束。如果使用數(shù)據(jù)庫(kù)關(guān)系圖,則可以在表之間創(chuàng)建關(guān)系以自動(dòng)創(chuàng)建外鍵約束。
總結(jié): 觸發(fā)器在某些時(shí)候可以代替外鍵,并不是在所有情況都可以代替。外鍵和觸發(fā)器也可以聯(lián)合使用
到此這篇關(guān)于MySQL數(shù)據(jù)庫(kù)觸發(fā)器從小白到精通的文章就介紹到這了,更多相關(guān)MySQL 觸發(fā)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql中mysql-bin.000001是什么文件可以刪除嗎
這篇文章主要介紹了mysql中mysql-bin.000001是什么文件可以刪除嗎,需要的朋友可以參考下2019-05-05如何通過(guò)SQL找出2個(gè)表里值不同的列的方法
本篇文章對(duì)如何通過(guò)SQL找出2個(gè)表里值不同的列的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05mysql數(shù)據(jù)庫(kù)常見(jiàn)的優(yōu)化操作總結(jié)(經(jīng)驗(yàn)分享)
這篇文章主要給大家介紹了關(guān)于mysql數(shù)據(jù)庫(kù)常見(jiàn)的優(yōu)化操作,文章總結(jié)的都是個(gè)人日常開(kāi)發(fā)使用mysql數(shù)據(jù)庫(kù)的經(jīng)驗(yàn)所得,其中包括Index索引、少用SELECT*、EXPLAIN SELECT以及開(kāi)啟查詢(xún)緩存等相關(guān)資料,相信會(huì)對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-04-04MySQL into_Mysql中replace與replace into用法案例詳解
這篇文章主要介紹了MySQL into_Mysql中replace與replace into用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09mysql數(shù)據(jù)庫(kù)表增添字段,刪除字段,修改字段的排列等操作
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)表增添字段,刪除字段,修改字段的排列等操作,修改表指的是修改數(shù)據(jù)庫(kù)之后中已經(jīng)存在的數(shù)據(jù)表的結(jié)構(gòu)2022-07-07減少mysql主從數(shù)據(jù)同步延遲問(wèn)題的詳解
本篇文章是對(duì)減少mysql主從數(shù)據(jù)同步延遲的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06