国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

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

詳細(xì)解讀MySQL的觸發(fā)器trigger

瀏覽:44日期:2023-05-08 10:17:42

什么是觸發(fā)器

MySQL的觸發(fā)器(trigger)和存儲(chǔ)過(guò)程一樣,都是嵌入到MySQL中的一段程序。觸發(fā)器是由事件來(lái)觸發(fā)某個(gè)操作,這些事件包括INSERT、UPDATE和DELETE語(yǔ)句。如果定義了觸發(fā)程序,當(dāng)數(shù)據(jù)庫(kù)執(zhí)行這些語(yǔ)句的時(shí)候就會(huì)激發(fā)觸發(fā)器執(zhí)行相應(yīng)的操作,觸發(fā)程序是與表有關(guān)的命名數(shù)據(jù)庫(kù)對(duì)象,當(dāng)表上出現(xiàn)特定事件時(shí),將激活該對(duì)象。

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

觸發(fā)器是個(gè)特殊的存儲(chǔ)過(guò)程,不同的是,執(zhí)行存儲(chǔ)過(guò)程要使用CALL語(yǔ)句來(lái)調(diào)用,而觸發(fā)器的執(zhí)行不需要使用CALL語(yǔ)句調(diào)用,也不需要手工啟動(dòng),只要當(dāng)一個(gè)預(yù)定義的事件發(fā)生的時(shí)候,就會(huì)被MySQL自動(dòng)調(diào)用。比如對(duì)student表進(jìn)行操作(INSERT、DELETE或UPDATE)時(shí)就會(huì)激活它執(zhí)行。

觸發(fā)器可以查詢(xún)其他表,而且可以包含復(fù)雜的SQL語(yǔ)句。它們主要用于滿(mǎn)足復(fù)雜的業(yè)務(wù)規(guī)則或要求。可以創(chuàng)建只有一條語(yǔ)句的觸發(fā)器,不過(guò)一般都是有多個(gè)執(zhí)行語(yǔ)句的觸發(fā)器用得比較多,即使單條語(yǔ)句的觸發(fā)器,也可以使用多條語(yǔ)句的觸發(fā)器的寫(xiě)法來(lái)寫(xiě),看下有多個(gè)執(zhí)行語(yǔ)句的觸發(fā)器的基本寫(xiě)法:

CREATE TRIGGER trigger_name trigger_time trigger_eventON tbl_name FOR EACH ROW trigger_stmt

解釋一下:

1、trigger_name標(biāo)識(shí)觸發(fā)器名稱(chēng),用戶(hù)自行指定

2、trigger_time標(biāo)識(shí)觸發(fā)時(shí)機(jī),可以指定為before或after

3、trigger_event標(biāo)識(shí)觸發(fā)事件,包括INSERT、UPDATE和DELETE

4、tbl_name標(biāo)識(shí)建立觸發(fā)器的表名,即在哪張表上建立觸發(fā)器

5、trigger_stmt是觸發(fā)器程序體,觸發(fā)器程序可以使用begin和end作為開(kāi)始和結(jié)束,中間包含多條語(yǔ)句

觸發(fā)器程序可以使用begin和end作為開(kāi)始和結(jié)束,中間包含多條語(yǔ)句。舉個(gè)例子,還是以前的學(xué)生表:

create table student(    studentId    int primary key    auto_increment    not null,    studentNamevarchar(10)   not null,    studentAgeint,    studentPhone    varchar(15))

給學(xué)生表的studentName、studentAge、studentPhone三個(gè)字段都創(chuàng)建一個(gè)觸發(fā)器表:

create table triggerstudentname(    t_studentName VARCHAR(10));create table triggerstudentAge(    t_studentAge int);create table triggerstudentPhone(    t_studentPhone VARCHAR(15));

創(chuàng)建一個(gè)觸發(fā)器,每次插入一條數(shù)據(jù)之后分別往三張表插字段:

CREATE TRIGGER trigger_student AFTER INSERT ON studentFOR EACH ROW BEGIN    INSERT INTO triggerstudentname values(NEW.studentName);    INSERT INTO triggerstudentAge values(NEW.studentAge);    INSERT INTO triggerstudentPhone values(NEW.studentPhone);END

插入三條數(shù)據(jù):

insert into student values(null,"Jack", "11", "55555555");insert into student values(null,"Dicky", "14", "66666666");insert into student values(null,"Coco", "19", "77777777");commit;

看一下三張表的情況:

沒(méi)什么問(wèn)題,執(zhí)行結(jié)果顯示,在向student表插入數(shù)據(jù)的同時(shí),triggerstudentname、triggerstudentAge和triggerstudentPhone三張表里面的數(shù)據(jù)都發(fā)生了變化,INSERT動(dòng)作觸發(fā)了觸發(fā)器。

查看觸發(fā)器

查看觸發(fā)器是指查看數(shù)據(jù)庫(kù)中已存在的觸發(fā)器的定義、狀態(tài)和語(yǔ)法信息等。可以通過(guò)命令來(lái)查看已經(jīng)創(chuàng)建的觸發(fā)器,有兩種方式可以查看觸發(fā)器,一一講解。

1、SHOW TRIGGERS語(yǔ)句查看觸發(fā)器

通過(guò)SHOW TRIGGERS查看觸發(fā)器的語(yǔ)句如下:

SHOW TRIGGERS;

用這個(gè)命令來(lái)查看一下觸發(fā)器:

有一部分沒(méi)截取完整,解釋一下主要部分的含義:

(1)Trigger表示觸發(fā)器的名稱(chēng),這里有兩個(gè)觸發(fā)器分別是tri_student和trigger_student

(2)Event表示激活觸發(fā)器的事件,這里的兩個(gè)觸發(fā)事件為插入操作INSERT

(3)Table表示激活觸發(fā)器的操作對(duì)象表,這里都為student表

(4)Statement表示激活觸發(fā)器之后執(zhí)行的語(yǔ)句

(5)Timing表示觸發(fā)器觸發(fā)的時(shí)間,分別為插入操作之前(BEFORE)和插入操作之后(AFTER)

2、在triggers表中查看觸發(fā)器信息

SHOW TRIGGERS語(yǔ)句查看當(dāng)前創(chuàng)建的所有觸發(fā)器信息,這在觸發(fā)器較少的情況下,使用該語(yǔ)句會(huì)很方便,如果要查看特定的觸發(fā)器信息,可以直接從infomation_schema數(shù)據(jù)庫(kù)中的triggers表中查找,通過(guò)SELECT命令查看,基本語(yǔ)法為:

SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE condition;

比如:

SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = "trigger_student";

可以自己查看一下命令運(yùn)行的效果

刪除觸發(fā)器

使用DROP TRIGGER語(yǔ)句可以刪除MySQL中已經(jīng)定義的觸發(fā)器,刪除觸發(fā)器的基本語(yǔ)法為:

DROP TRIGGER [schema_name.]trigger_name;

schema_name表示數(shù)據(jù)庫(kù)名稱(chēng),是可選的,如果省略了schema_name,將從當(dāng)前數(shù)據(jù)庫(kù)中刪除觸發(fā)器,trigger_name是要?jiǎng)h除的觸發(fā)器的名稱(chēng),比如:

DROP TRIGGER school.tri_student

觸發(fā)器tri_student刪除成功

使用觸發(fā)器的注意點(diǎn)

在使用觸發(fā)器的時(shí)候需要注意:對(duì)于相同的表,相同的事件只能創(chuàng)建一個(gè)觸發(fā)器

比如對(duì)表student創(chuàng)建了一個(gè)BEFORE INSERT觸發(fā)器,那么如果對(duì)表student再次創(chuàng)建一個(gè)BEFORE INSERT觸發(fā)器,MySQL將會(huì)報(bào)錯(cuò),此時(shí),只可以在表student上創(chuàng)建AFTER INSERT或者BEFORE UPDATE類(lèi)型的觸發(fā)器。靈活地運(yùn)用觸發(fā)器將為操作省去很多麻煩。

到此這篇關(guān)于詳細(xì)解讀MySQL的觸發(fā)器trigger的文章就介紹到這了,更多相關(guān)MySQL觸發(fā)器trigger內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標(biāo)簽: MySQL
相關(guān)文章:
主站蜘蛛池模板: 团风县| 历史| 资兴市| 黄梅县| 南城县| 从化市| 盐边县| 新野县| 桓仁| 辽源市| 广汉市| 南皮县| 大安市| 米脂县| 高州市| 迁安市| 永川市| 灌南县| 东明县| 新闻| 永州市| 崇仁县| 开封市| 邢台县| 庆城县| 珠海市| 临汾市| 中卫市| 虹口区| 运城市| 堆龙德庆县| 托克逊县| 黎平县| 阜城县| 临夏市| 方正县| 泸州市| 荔波县| 贵阳市| 永宁县| 甘南县|