觸發器是一個特殊的存儲過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,比如當對一個表進行操作( 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,提示組函數的使用無效
繼續學習去了..