1 8(SQL學習筆記)觸發器

2021-09-24 22:29:15 字數 4071 閱讀 4115

一、觸發器簡介

當需要某些操作在某些語句執行之前或之後執行就需要使用觸發器。

例如每次插入資料時進行資料校對,每次刪除資料後將刪除內容備份到新錶。

這些操作我們希望它(某些語句)在滿足某些條件時自動執行,也可以稱為這些條件觸發了這些操作。

既然某些操作可以觸發某些操作,那麼關鍵要定義兩點:

1.觸發條件。

2.觸發後執行的操作。

mysql中觸發器只對insert、delete、update語句有效,即執行這些語句可以觸發設定的觸發器。

觸發器根據觸發的時間可分為before、after,一種是在被執行語句執行前觸發,一種是在被執行語句執行後觸發。

建立觸發器需要定義觸發器名(最好當前資料庫唯一)、觸發器關聯的表、觸發語句(insert|delete|update)、

觸發時機(before|after)。

create

trigger newproduct02 after insert

onproducts

for each row select 'add info' into

@info;

-- insert into products(...) values(...);

-- select @info;

建立了乙個名為newproduct02的觸發器,該觸發器在執行insert語句之後執行。

for each row代表行級觸發,表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器,

也就是說觸發器的觸發頻率是針對每一行資料觸發一次。

select 『add info』 into @info 代表觸發器執行的操作,將『add info』 設定給變數info(使用者變數採用@開頭),

當向products表執行insert語句後,會執行觸發器將值設定給@info.

通過select @info;可顯示變數值。

注:乙個表中

二、刪除觸發器

drop trigger 觸發器名。

三、使用觸發器

3.1 insert觸發器

insert觸發器的觸發時機可以是before、after。

在insert觸發器內可以引用乙個名為new的虛擬表。

該虛擬表表示將要插入(before)或已經插入(after)的資料。

在before中代表將要插入的資料

在after中代表插入後的資料,

insert into tablename(id,name) values('1', 'hcf'):可以看做:

new.id = '1', new.name = 'hcf';

before insert trigger...(此時new代表將要插入的資料,如果此時對new.id的值進行修改,最後插入的值也會被修改)

insert into tablename(id,name) values(new.id, new.name);

after insert trigger...(此時new.id代表插入後的資料。插入完成後不可對new進行修改)

下面看乙個例子理解。

create

trigger newproduct03 after insert

onproducts

for each row select new.prod_id into

@info;

-- insert into products(prod_id,...) values(123,...);

-- select @info

newproduct03觸發器為執行後觸發,所以new代表插入的資料。

new.prod_id代表插入後的資料123.後續通過select顯示出來,

即每插入一條資料都會顯示該資料的prod_id。

插入前(before)可以通過set new.*** = ***來修改值。

3.2 delete觸發器

delete觸發器的觸發事件同樣可以是before,after。

delete中可以引用一張名為old的虛擬表,代表刪除前或刪除後的資料。

old表為唯讀無法修改,所以before、after的old表代表資料是一樣的。

dlete from tablename where id = 1;可看做: 

old.id = 1, old.name = 'hcf' ...代表刪除前表中所有列的資料。

before delete trigger...(old唯讀,無法修改,old代表刪除前資料)

delete from tablename where id = old.id;  

before delete trigger...(old唯讀,無法修改,old代表刪除前資料)

在刪除觸發器中編寫語句,將刪除的資料存放在一張表中,如果出現誤操作後續可還原被刪除資料。

delimiter //

create

trigger productsdeleteinfo after delete

onproducts

foreach row

begin

insert

into

`productsin`(`prod_id`, `vend_id`, `prod_name`, `prod_price`, `prod_desc`)

values

(old.prod_id, old.vend_id, old.prod_name, old.prod_price, old.prod_desc);

end//

delimiter ;

delete

from products where prod_id =

'ryl01

';

當對products表執行刪除操作後,會將刪除的資料寫入productsin表中。(productsin表要存在)

old代表刪除前的資料,由於old唯讀不能修改,所以也代表刪除後的資料。

3.3 update觸發器

update觸發器的觸發時機同樣分為兩種,一種是執行前(before)、一種是執行後(after)。

update觸發器中提供old表用於訪問舊資料,即執行update語句之前表中的資料。

無論是before.還是after,old都代表更新前的資料。可以看做是原表中的資料,old唯讀不可修改。

new可以看做update語句中的值,例如update tablename set id=2 where id = 1;

此時new.id就代表2,也可以說2就是new.id。

update tablename set id=2 where id = 1;語句可看做:

new.id = 2;

update before trigger...(可對new.id進行修改; set new.id = ***)

update tablename set id= new.id  where id = 1;

update after trigger...  (更新後,不可對new.id進行修改)

其中before trigger是執行update語句之前的觸發器,

如果在update before trigger...中將new.id進行修改,

最後更新的值也會被修改。

在update after trigger...中new.id就相當於最終更新的值。

delimiter //

create

trigger updateset before update

onproducts

foreach row

begin

select new.prod_id, old.prod_id into

@nid, @oid

;end

//delimiter ;

update

products

set prod_id =

'gcmh

'where prod_id =

'123

';

select

@nid, @oid;

new表示更新後的資料,此處為『gcmh』,old代表更新前資料『123』;  

Mysql學習歷程(18) 觸發器

觸發器 trigger 事先為某張表繫結好一段 當表中某些內容發生改變的時候 增刪改 系統會自動觸發 執行 事件型別 增刪改 insert,delete,update 觸發事件 before,after 觸發物件 表中每一條記錄 最多一張錶能有6個觸發器 建立觸發器 mysql中沒有大括號,都是用對...

SQL觸發器課堂筆記

建立觸發器 觸發器 保證資料完整性,與表事件相關的特殊的儲存過程,由事件觸發 比如當對乙個表進行操作時 alter,delete,update delete student where sno 1201011102 select from student where sno 1201011102 插...

觸發器學習筆記

觸發器學習 概念 觸發器是一種特殊的儲存過程,mysql5.0以上版本支援觸發器,觸發器是與表有關的命名資料庫物件,當表出現特定事件時,將啟用該物件。觸發器可以處理很多需要程式來完成的工作,這樣做的好處是減輕程式帶來的各種各樣的問題如,效率 bug和維護等。當對某一表進行諸如update inser...