日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

MySQL 觸發(fā)器的使用及需要注意的地方

瀏覽:17日期:2023-10-06 14:07:47
關(guān)于觸發(fā)器

現(xiàn)實(shí)開發(fā)中我們經(jīng)常會(huì)遇到這種情況,比如添加、刪除和修改信息的時(shí)候需要記錄日志,我們就要在完成常規(guī)的數(shù)據(jù)庫邏輯操作之后再去寫入日志表,這樣變成了兩步操作,更復(fù)雜了。

又比如刪除一個(gè)人員信息的時(shí)候,需要將他的購物記錄、收貨地址、收藏夾等都刪了,這個(gè)連續(xù)的操作容易出錯(cuò),一致性和完整性不好保證。這時(shí)候就要使用觸發(fā)器,既可以免去一堆的業(yè)務(wù)邏輯代碼,又能更好的保證數(shù)據(jù)完整性。

觸發(fā)器(trigger)是一種與表有關(guān)的數(shù)據(jù)庫對(duì)象:在滿足定義條件時(shí)觸發(fā)某種操作,并執(zhí)行觸發(fā)器中定義的語句集合。觸發(fā)器的這種特性可以協(xié)助應(yīng)用在數(shù)據(jù)庫端保證數(shù)據(jù)的完整性。

它是一種與表事件相關(guān)的特殊的存儲(chǔ)過程,當(dāng)對(duì)一個(gè)表進(jìn)行操作( insert,delete, update)時(shí)就會(huì)激活執(zhí)行。

觸發(fā)器的使用創(chuàng)建觸發(fā)器

創(chuàng)建觸發(fā)器的語法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event ON t_name FOR EACH ROW trigger_stmt

說明:

trigger_name:觸發(fā)器名稱

tirgger_time:觸發(fā)執(zhí)行時(shí)間點(diǎn),數(shù)據(jù)操作前(BEFORE) 或者 數(shù)據(jù)操作后(AFTER)

trigger_event:觸發(fā)事件,增(INSERT)、刪(DELETE)、改(UPDATE)

t_name:指的是在 t_name 這張表上建立觸發(fā)器

trigger_stmt:觸發(fā)器的程序體,可以是一條SQL語句或者是用BEGIN和END包含的多條語句

觸發(fā)器只能創(chuàng)建在永久表(Permanent)上,不能創(chuàng)建在臨時(shí)表(Temporary)上

FOR EACH ROW 固定表達(dá)式,表示任何一條記錄上的操作滿足觸發(fā)事件都會(huì)觸發(fā)該觸發(fā)器

tirgger_time有兩種類型,trigger_event有三種類型,所以他們一共有6種組合:BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE,AFTER INSERT,AFTER DELETE,AFTER UPDATE

示例(先創(chuàng)建一個(gè)日志表,用于觸發(fā)器觸發(fā)時(shí)候填入值):

/*先創(chuàng)建一個(gè)日志表,用于觸發(fā)器觸發(fā)時(shí)候填入值*/mysql> DROP TABLE IF EXISTS `TriggerLog`;Query OK, 0 rows affectedmysql> CREATE TABLE `TriggerLog`( `id` INT auto_increment PRIMARY KEY, `trigger_time` VARCHAR(30), `trigger_event` VARCHAR(30), `memo` VARCHAR(200));Query OK, 0 rows affected

Insert類型觸發(fā)器:

mysql>/*這邊聲明SQL腳本的結(jié)束符為// */DELIMITER //DROP TRIGGER IF EXISTS trig_after_insert;CREATE TRIGGER trig_after_insert AFTER INSERT ON students FOR EACH ROWBEGIN insert into `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) values (’after’,’insert’,concat(’new student info,id:’,cast(new.studentid as char)));END //Query OK, 0 rows affectedmysql>/*重置SQL腳本的結(jié)束符為; */DELIMITER ;Query OK, 0 rows affectedmysql>/*插入一條數(shù)據(jù) */insert into students(studentname,score,classid) values(’trigger1’,100,0);Query OK, 1 row affectedmysql>/*查詢?nèi)罩颈砜词欠裼杏|發(fā)寫入 */select * from `TriggerLog`;+----+--------------+---------------+------------------------+| id | trigger_time | trigger_event | memo |+----+--------------+---------------+------------------------+| 1 | after | insert | new student info,id:21 |+----+--------------+---------------+------------------------+1 row in set

Update類型觸發(fā)器:

mysql>/*這邊聲明SQL腳本的結(jié)束符為// */DELIMITER //DROP TRIGGER IF EXISTS trig_after_update;CREATE TRIGGER trig_after_update AFTER UPDATE ON students FOR EACH ROWBEGIN insert into `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) values (’after’,’update’,concat(’update student info,id:’,cast(new.studentid as char)));END //Query OK, 0 rows affectedmysql>/*重置SQL腳本的結(jié)束符為; */DELIMITER ;Query OK, 0 rows affectedmysql>/*更新數(shù)據(jù) */update students set score=99 where studentname=’trigger1’;Query OK, 1 row affectedRows matched: 1 Changed: 1 Warnings: 0mysql>/*查詢?nèi)罩颈砜词欠窀碌臅r(shí)候有觸發(fā)寫入 */select * from `TriggerLog`;+----+--------------+---------------+---------------------------+| id | trigger_time | trigger_event | memo |+----+--------------+---------------+---------------------------+| 1 | after | insert | new student info,id:21 || 2 | after | update | update student info,id:21 |+----+--------------+---------------+---------------------------+2 rows in set

Delete類型觸發(fā)器:

mysql>/*這邊聲明SQL腳本的結(jié)束符為// */DELIMITER //DROP TRIGGER IF EXISTS trig_after_delete;CREATE TRIGGER trig_after_delete AFTER DELETE ON students FOR EACH ROWBEGIN insert into `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) values (’after’,’update’,concat(’delete student info,id:’,cast(old.studentid as char)));END //Query OK, 0 rows affectedmysql>/*重置SQL腳本的結(jié)束符為; */DELIMITER ;Query OK, 0 rows affectedmysql>/* 刪除數(shù)據(jù) */delete from students where studentid=21;Query OK, 1 row affectedmysql>/*查詢?nèi)罩究磩h除是否有觸發(fā)寫入*/select * from `TriggerLog`;+----+--------------+---------------+---------------------------+| id | trigger_time | trigger_event | memo |+----+--------------+---------------+---------------------------+| 1 | after | insert | new student info,id:21 || 2 | after | update | update student info,id:21 || 3 | after | update | delete student info,id:21 |+----+--------------+---------------+---------------------------+3 rows in set查看觸發(fā)器

查看全部觸發(fā)器

show triggers; --語法

mysql> show triggers;+-------------------+--------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+| Trigger | Event | Table | Statement | Timing | Created | sql_mode | Definer | character_set_client | collation_connection | Database Collation |+-------------------+--------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+| trig_after_insert | INSERT | students | BEGIN insert into `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) values (’after’,’insert’,concat(’new student info,id:’,cast(new.studentid as char)));END | AFTER | NULL | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@localhost | utf8 | utf8_general_ci | latin1_swedish_ci || trig_after_update | UPDATE | students | BEGIN insert into `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) values (’after’,’update’,concat(’update student info,id:’,cast(new.studentid as char)));END | AFTER | NULL | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@localhost | utf8 | utf8_general_ci | latin1_swedish_ci || trig_after_delete | DELETE | students | BEGIN insert into `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) values (’after’,’update’,concat(’delete student info,id:’,cast(old.studentid as char)));END | AFTER | NULL | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@localhost | utf8 | utf8_general_ci | latin1_swedish_ci |+-------------------+--------+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+---------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+3 rows in set

查看觸發(fā)器的創(chuàng)建語句

show create trigger trigger_name; --語法

mysql> show create trigger trig_after_insert;+-------------------+--------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+| Trigger | sql_mode | SQL Original Statement | character_set_client | collation_connection | Database Collation |+-------------------+--------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+| trig_after_insert | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` TRIGGER trig_after_insert AFTER INSERT ON students FOR EACH ROWBEGIN insert into `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) values (’after’,’insert’,concat(’new student info,id:’,cast(new.studentid as char)));END | utf8 | utf8_general_ci | latin1_swedish_ci |+-------------------+--------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+1 row in set刪除觸發(fā)器

drop trigger trigger_name; --語法

mysql> drop trigger trig_after_insert;Query OK, 0 rows affected mysql> show create trigger trig_after_insert;1360 - Trigger does not exist 使用時(shí)的注意點(diǎn)NEW / OLD的使用區(qū)別

觸發(fā)器針對(duì)的是數(shù)據(jù)庫中的每一行記錄,每行數(shù)據(jù)在操作前后都會(huì)有一個(gè)對(duì)應(yīng)的狀態(tài),觸發(fā)器將沒有操作之前的狀態(tài)保存到 old 關(guān)鍵字中,將操作后的狀態(tài)保存到 new 中

new.cname --新增行(或修改前的行)的某列數(shù)據(jù) old.cname --刪除行(或修改后的行)的某列數(shù)據(jù)

需要注意的是,old 和 new 不是所有觸發(fā)器都有

觸發(fā)器類型 new和old的使用 INSERT型觸發(fā)器 沒有 old,只有 new,new 表示將要(插入前)或者已經(jīng)增加(插入后)的數(shù)據(jù) UPDATE型觸發(fā)器 既有 old 也有 new,old 表示更新之前的數(shù)據(jù),new 表示更新之后的數(shù)據(jù) DELETE型觸發(fā)器 沒有 new,只有 old,old 表示將要(刪除前)或者已經(jīng)被刪除(刪除后)的數(shù)據(jù)

其實(shí)我們上面已經(jīng)用過 new/old 來創(chuàng)建觸發(fā)器并獲取數(shù)據(jù),我們根據(jù)這個(gè)表格重新來修改下那個(gè)更新觸發(fā)器(trig_after_update),輸出修改前和修改后的內(nèi)容比較:

mysql>/*這邊聲明SQL腳本的結(jié)束符為// */DELIMITER //DROP TRIGGER IF EXISTS trig_after_update;CREATE TRIGGER trig_after_update AFTER UPDATE ON students FOR EACH ROWBEGIN insert into `TriggerLog`(`trigger_time`,`trigger_event`,`memo`) values (’after’,’update’,concat(’from:’,old.studentname,’,’,old.score,’ ’,’to:’,new.studentname,’,’,new.score));END //Query OK, 0 rows affectedmysql>/*重置SQL腳本的結(jié)束符為; */DELIMITER ;Query OK, 0 rows affectedmysql>/*更新成績和名稱 */update students set score=106,studentname=’trigger2’ where studentid=17;Query OK, 1 row affectedRows matched: 1 Changed: 1 Warnings: 0mysql>/*根據(jù)old和new 對(duì)比更新前后的值 */select * from `TriggerLog`;+----+--------------+---------------+--------------------------------------+| id | trigger_time | trigger_event | memo |+----+--------------+---------------+--------------------------------------+| 1 | after | insert | new student info,id:21|| 2 | after | update | update student info,id:21 || 3 | after | update | delete student info,id:21 || 4 | after | update | from:test2,101.00 to:trigger2,106.00 |+----+--------------+---------------+--------------------------------------+4 rows in set無法觸發(fā)對(duì)同表的修改

MySQL 的觸發(fā)器中不能對(duì)本表進(jìn)行 insert、update 和 delete 操作,否則會(huì)報(bào)錯(cuò)

mysql>/*這邊聲明SQL腳本的結(jié)束符為// */DELIMITER //DROP TRIGGER IF EXISTS trig_after_insert;CREATE TRIGGER trig_after_insert AFTER INSERT ON students FOR EACH ROWBEGIN update students set score = score+1 where studentid= new.studentid;END //Query OK, 0 rows affectedmysql>/*重置SQL腳本的結(jié)束符為; */DELIMITER ;Query OK, 0 rows affectedmysql>/*插入一條數(shù)據(jù)之后因?yàn)橛|發(fā)了對(duì)本表的修改,所以報(bào)錯(cuò)了 */insert into students(studentname,score,classid) values(’trigger2’,101,0);1442 - Can’t update table ’students’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.小結(jié)

1、觸發(fā)器可以通過數(shù)據(jù)庫中的關(guān)聯(lián)表實(shí)現(xiàn)級(jí)聯(lián)更改,即一張表數(shù)據(jù)的改變會(huì)影響其他表的數(shù)據(jù),如數(shù)據(jù)修改,數(shù)據(jù)統(tǒng)計(jì),數(shù)據(jù)復(fù)制等。2、可以保證數(shù)據(jù)安全,并進(jìn)行安全校驗(yàn),限制用戶具有操作數(shù)據(jù)庫的某種權(quán)利。3、可以對(duì)復(fù)雜邏輯的實(shí)現(xiàn)進(jìn)行數(shù)據(jù)完整性檢查和約束。4、使用觸發(fā)器的要應(yīng)需而用,如果過分依賴觸發(fā)器,會(huì)影響數(shù)據(jù)庫的結(jié)構(gòu),增加數(shù)據(jù)庫的執(zhí)行和維護(hù)成本。5、觸發(fā)器有BEFORE觸發(fā)器和AFTER觸發(fā)器的卻別,所以它的執(zhí)行步驟是先執(zhí)行 BEFORE觸發(fā)器,再執(zhí)行業(yè)務(wù)腳本,最后執(zhí)行AFTER觸發(fā)器。需要注意的是 某一個(gè)步驟錯(cuò)誤后就不再執(zhí)行了, 如果是事務(wù)表,會(huì)被回滾,如果是非事務(wù)表,那么就無法回滾了,數(shù)據(jù)可能有不一致性。

觸發(fā)器的兩種限制

1、觸發(fā)程序不能調(diào)用將數(shù)據(jù)返回客戶端的存儲(chǔ)程序,也不能使用采用CALL語句的動(dòng)態(tài)SQL語句,但是允許存儲(chǔ)程序通過參數(shù)將數(shù)據(jù)返回觸發(fā)程序,也就是存儲(chǔ)過程或者函數(shù)通過OUT或者INOUT類型的參數(shù)將數(shù)據(jù)返回觸發(fā)器是可以的,但是不能調(diào)用直接返回?cái)?shù)據(jù)的過程。2、不能再觸發(fā)器中使用以顯示或隱式方式開始或結(jié)束事務(wù)的語句,如START TRANS-ACTION,COMMIT或ROLLBACK。

以上就是MySQL 觸發(fā)器的使用及需要注意的地方的詳細(xì)內(nèi)容,更多關(guān)于MySQL 觸發(fā)器的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品普通话对白| 日韩亚洲国产欧美| 欧美91在线| 日韩精品永久网址| 国产精品人人爽人人做我的可爱| 日韩精品中文字幕一区二区| 免费亚洲一区| 欧美成人亚洲| 日韩av中文字幕一区| 精品72久久久久中文字幕| 欧美日韩第一| 日韩国产高清在线| 国产66精品| 日韩精品一卡| 亚洲免费福利一区| 国产一区二区三区网| 亚洲电影在线一区二区三区| 日本久久一区| 日韩啪啪电影网| 亚洲精品视频一二三区| 精品国产欧美日韩一区二区三区| 在线观看免费一区二区| 国产伦精品一区二区三区视频| 欧洲av一区二区| 亚州精品视频| 日韩一区电影| 日韩av成人高清| 久久男女视频| 日韩动漫一区| 婷婷精品视频| 国产精品中文字幕亚洲欧美| 蜜桃tv一区二区三区| 欧美天堂一区二区| 国产一在线精品一区在线观看| 日韩一区二区三区免费视频| 日韩天堂在线| 国产日韩一区二区三免费高清 | 国产日韩在线观看视频| 久久久五月天| 国产高清日韩| 在线精品小视频| 国产一区二区三区日韩精品| 天堂va蜜桃一区二区三区| 91欧美日韩| 欧美日韩一区二区三区在线电影| 婷婷成人基地| 97在线精品| 国产日韩欧美在线播放不卡| 91久久黄色| 成人片免费看| 国产精品对白| 亚洲免费专区| 九九综合九九| 久久久久久一区二区| 日韩av网站在线观看| 99久久亚洲精品蜜臀| 卡一卡二国产精品| 日韩精品三级| 视频一区在线视频| 久久久噜噜噜| 成人午夜网址| 久久99精品久久久久久园产越南| 亚洲精品九九| 国产农村妇女精品一二区| 日韩免费小视频| 精品欠久久久中文字幕加勒比| 91精品国产自产在线丝袜啪| 亚洲一区中文| 欧美一区二区三区高清视频| 国产一区2区| 国产精品一国产精品k频道56| 亚洲尤物av| 麻豆9191精品国产| 影院欧美亚洲| 国内精品福利| 日韩毛片在线| 天堂а√在线最新版中文在线| 久久精品国产一区二区| 国产伦一区二区三区| 日韩国产精品久久久| 亚洲精品福利| 午夜精品福利影院| 综合视频一区| 亚洲精品欧美| 亚洲精品在线国产| 久久夜色精品| 蜜桃一区二区三区在线| 国产偷自视频区视频一区二区| 欧美亚洲国产精品久久| 久久久久亚洲| 99久久婷婷这里只有精品| 91tv亚洲精品香蕉国产一区| 麻豆精品蜜桃| 亚洲一级二级| 黑丝美女一区二区| 精品欧美激情在线观看| 香蕉人人精品| 夜夜嗨av一区二区三区网站四季av| 婷婷激情图片久久| 伊人精品在线| 亚洲免费播放| 美国三级日本三级久久99| 中文字幕亚洲精品乱码| 日本成人精品| 国产精品2023| 国产精品毛片一区二区在线看| 午夜av不卡| 欧美精品一区二区三区精品| 亚洲一区激情| 亚洲精品一级| 国产精品探花在线观看| 精品在线网站观看| av资源中文在线天堂| 日韩欧美一区二区三区在线观看 | 7m精品国产导航在线| 奇米777国产一区国产二区| 日韩欧美高清一区二区三区| 日本午夜精品| 久久亚洲精精品中文字幕| 国产精品精品| 欧美一区二区性| 日韩中文字幕一区二区三区| 亚洲深夜福利在线观看| 国产日韩视频| 欧美国产美女| 亚洲精品在线观看91| 在线观看一区| 国产精品对白| 欧美羞羞视频| 99视频在线精品国自产拍免费观看| 噜噜噜躁狠狠躁狠狠精品视频 | 青草国产精品久久久久久| 国产精品一区二区三区美女| 国产第一亚洲| 午夜日韩在线| 日本亚洲最大的色成网站www | 中文字幕一区二区三区日韩精品| 国产欧美一区二区三区精品观看 | 国产一区观看| 丝袜美腿高跟呻吟高潮一区| 国产欧美在线| 欧美成人a交片免费看| 久久成人国产| 国产精品毛片aⅴ一区二区三区| 国产精品久久久久久久久久10秀 | 亚洲一级淫片| 国内自拍视频一区二区三区| 欧美va亚洲va日韩∨a综合色| 亚洲开心激情| 精品国产精品久久一区免费式| 久久高清精品| 日本a级不卡| 日韩欧美三级| 亚洲欧美在线专区| 色偷偷偷在线视频播放| 蜜桃久久久久久| 高清一区二区三区| 西西人体一区二区| 六月丁香综合在线视频| 欧美午夜不卡| 欧美成人精品一级| 亚洲精品va| 国产精品视频一区二区三区| 激情综合自拍| 国产精品久久久久久妇女| 999精品色在线播放| 欧美一级二区| 在线日韩av| 国产精品白丝一区二区三区| 欧美不卡高清| 久久影院资源站| 久久高清国产| 特黄毛片在线观看| 欧美在线看片| 尤物精品在线| 中文字幕高清在线播放| 青草av.久久免费一区| 免费av一区二区三区四区| 国产精品久久久免费| 一区免费视频| 麻豆理论在线观看| 久久精品av麻豆的观看方式| 伊人影院久久| 中国字幕a在线看韩国电影| 日韩不卡一区二区| 99日韩精品| 欧美日韩视频免费观看| 国产精品magnet| 日韩一区二区三区四区五区| 欧美日韩国产免费观看视频| 福利片在线一区二区| 欧美自拍一区| 蜜桃视频免费观看一区| 999国产精品永久免费视频app| 国产精品va| 欧美天堂一区| 婷婷综合电影| 免播放器亚洲一区| 精品一区欧美| 国产麻豆久久|