MySQL_觸發器Trigger _筆記

觸發器是一個特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,比如當對一個表進行操作( insert,delete, update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。

換種個人理解的方法就是,當一張表做了插入,更新,刪除等動作時,就會通過設定好的觸發器觸發從而聯動另一張表,自動進行相應的操作。

 

查看觸發器

SHOW TRIGGERS \G                                                               查詢所有觸發器的信息,不能查詢指定的觸發器

SELECT * FROM information_schema.triggers \G               查詢tiggers中的信息,會顯示所有觸發器的詳細信息

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='t1_triggers' \G 

只查詢t1_triggers觸發器的詳細信息。

 

刪除觸發器

DROP  TRIGGER  觸發器名 | 數據庫名.觸發器名;

 

創建觸發器語法

DELIMITER $

create trigger Trigger_name <before | after | instead of> <insert | update | delete>

on table_name

for each row

BEGIN

--觸發器代碼

END $

DELIMITER ;

 

DELIMITER是mysql中的修改命令結束符,默認情況下MySQL的命令是以分號(;)結束的,所以開始將結束符改爲($),END後才結束這段創建觸發器操作,最後再將結束符改爲(;)。可以縮寫爲(\d)。

Trigger_name是觸發器的名稱,觸發器名稱在當前數據庫中必須是唯一的。

<before | after | instead of>是觸發時間,before和after 用於表示觸發器是在激活它的語句之前或者之後觸發,通常使用after,如果希望驗證新數據是否滿足使用限制,則使用 before。instead of觸發器用在對視圖的更新上。

table_name爲關聯表名

[FOR EACH ROW]爲可選項,如果註明了FOR EACH ROW,則說明了該觸發器是一個行級的觸發器,DML語句處理每條記錄都會執行觸發器;

 

觸發器代碼中NEW和OLD的使用:

 

 

對於INSERT語句, 只有NEW是合法的;

對於DELETE語句,只有OLD才合法;

對於UPDATE語句,NEW、OLD可以同時使用;

刪除和更新後面的條件必須爲主鍵。

 

 

做個簡單的測試:

先創建兩張表

create table t1(

id int primary key AUTO_INCREMENT not null,

name varchar(20),

sex enum('m','f'),

salary double(10,2)

);

 

create table t2(

total int,

t_salary double(15,2)

);

 

現在這兩張表是沒有關聯的,創建一個觸發器

\d $

create trigger t1_insert

after insert on t1

for each row

BEGIN

update t2 set total=total+1,t_salary=t_salary+new.salary;

END$

\d ;

 

insert into t2(total,t_salary) values(0,0);

給t2表一個初始值用來算數,然後向t1表插入一條數據,可以看到t2表自動進行了觸發器的操作

insert into t1(name,sex,salary) values('aoteman','m',10000);

 

insert into t1(name,sex,salary) values('shejing','f',20000),('huluwa','m',30000);

再試一下

 

想了半天,不知道更新和刪除的觸發器該咋寫,試着用統計函數來計算表2,但是創建觸發器後無法再更新表1,提示組函數的使用無效

 

繼續學習去了..

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章