更新時間:2021-01-13 17:05:24 來源:動力節(jié)點 瀏覽1179次
在我們正式學(xué)習(xí)MySQL觸發(fā)器之前,我們先來看看什么是觸發(fā)器。觸發(fā)器是一個特殊的存儲過程,不同的是存儲過程要用CALL來調(diào)用,而觸發(fā)器不需要使用CALL ,也不需要手工啟動,只要當(dāng)一個預(yù)定義的事件發(fā)生的時候,就會被MYSQL自動調(diào)用。簡單的說,觸發(fā)器是存儲SQL過程的一種特殊形式,就是一張表發(fā)生了某件事(插入、刪除、更新操作),然后自動觸發(fā)了預(yù)先編寫好的若干條SQL語句的執(zhí)行。
在MySQL數(shù)據(jù)庫中,觸發(fā)器是由事件驅(qū)動的專用過程,由DBMS存儲和管理。觸發(fā)事件的操作和觸發(fā)器里的SQL語句是一個事務(wù)操作,具有原子性,要么全部執(zhí)行,要么都不執(zhí)行;MySQL觸發(fā)器能夠有效保證數(shù)據(jù)的完整性,起到了對數(shù)據(jù)約束的作用。
創(chuàng)建MySQL觸發(fā)器的語法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
觸發(fā)程序是與表有關(guān)的命名數(shù)據(jù)庫對象,當(dāng)表上出現(xiàn)特定事件時,將激活該對象。 觸發(fā)程序與命名為tbl_name的表相關(guān)。tbl_name必須引用永久性表。不能將觸發(fā)程序與臨時表表或視圖關(guān)聯(lián)起來。
trigger_time是觸發(fā)程序的動作時間。它可以是BEFORE或AFTER,以指明觸發(fā)程序是在激活它的語句之前或之后觸發(fā)。
trigger_event指明了激活觸發(fā)程序的語句的類型。trigger_event可以是下述值之一:
1.INSERT:將新行插入表時激活觸發(fā)程序,可能通過 INSERT、LOAD DATA、REPLACE 語句觸發(fā);
2.UPDATE:更改某一行時激活觸發(fā)程序,可能通過 UPDATE 語句觸發(fā);
3.DELETE:從表中刪除某一行時激活觸發(fā)程序,可能通過 DELETE、REPLACE 語句觸發(fā);
請注意,trigger_event與以表操作方式激活觸發(fā)程序的SQL語句并不很類似,這點很重要。例如,關(guān)于INSERT的BEFORE觸發(fā)程序不僅能被INSERT語句激活,也能被LOAD DATA語句激活。
trigger_stmt是當(dāng)觸發(fā)程序激活時執(zhí)行的語句。如果你打算執(zhí)行多個語句,可使用BEGIN ... END復(fù)合語句結(jié)構(gòu)。這樣,就能使用存儲子程序中允許的相同語句。
1.創(chuàng)建一個單執(zhí)行語句的觸發(fā)器首先創(chuàng)建一個account表,表中有兩個字段,分別為:acct_num字段(定義為int類型)和amount字段(定義成浮點類型);其次創(chuàng)建一個名為ins_sum的觸發(fā)器,觸發(fā)的條件是向數(shù)據(jù)表account插入數(shù)據(jù)之前, 對新插入的amount字段值進(jìn)行求和計算:
create table account(act_num int,amount decimal(10,2));
create trigger ins_sum before insert on account
for each row set @sum=@sum+new.amount;
set @sum = 0;
insert into account values(1,1.00),(2,2.00);
select @sum;
2.創(chuàng)建有多個執(zhí)行語句的觸發(fā)器,語法如下:
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END
示例如下:
use study;
create table test1(a1 int);
create table test2(a2 int);
create table test3(a3 int not null auto_increment primary key);
create table test4(
a4 int not null auto_increment primary key,
b4 int default 0);
delimiter //
create trigger testref before insert on test1
for each row begin
insert into test2 set a2=new.a1;
delete from test3 where a3=new.a1;
update test4 set b4=b4+1 where a4=new.a1;
end
//
delimiter;
insert into test3(a3) values
(null),(null),(null),(null),(null),
(null),(null),(null),(null),(null);
insert into test4(a4) values
(0),(0),(0),(0),(0),(0),(0),(0),(0),(0);
insert into test1(a1) values
(1),(3),(1),(7),(1),(8),(4),(4);
select * from test1;
select * from test2;
select * from test3;
select * from test4;
執(zhí)行結(jié)果顯示,在向表test1插入記錄的時候,test2、test3、test4都發(fā)生了變化。從這個例子看insert觸發(fā)了觸發(fā)器,向表test2中插入test1的值,刪除了test3中相同的內(nèi)容,同時更新了test4中b4,即與插入的值相同的個數(shù)。
以上就是MySQL觸發(fā)器的相關(guān)介紹,觸發(fā)器可通過數(shù)據(jù)庫中的相關(guān)表實現(xiàn)級聯(lián)更改,不過,通過級聯(lián)引用完整性約束可以更有效地執(zhí)行這些更改。盡管MySQL觸發(fā)器功能強(qiáng)大,但由于我們的濫用會造成數(shù)據(jù)庫及應(yīng)用程序的維護(hù)困難,因此我們在MySQL數(shù)據(jù)庫中還是要慎重使用。想要學(xué)習(xí)更多的MySQL數(shù)據(jù)庫的相關(guān)知識,就來觀看本站的MySQL教程,體驗全新的學(xué)習(xí)之旅。
初級 202925
初級 203221
初級 202629
初級 203743