深入淺出mysql 觸發器

2021-08-14 02:12:40 字數 3578 閱讀 2268

十三. 觸發器

13.1 建立觸發器

語法:create trigger trigger_name trigger_event on table_name for each row trigger_stmt

對於insert into .... on duplicate key update 觸發順序

語法create trigger trigger_name trigger_time trigger_event

on tbl_name for each row trigger_stmt

trigger_time: 是觸發器的觸發時間,可以是 before 或者 after,before 的含義指在檢查約束前觸發,而 after 是在檢查約束後觸發。

trigger_event :就是觸發器的觸發事件,可以是 insert、update 或者 delete。

範例為 film 表建立了 after insert 的觸發器,具體如下:

delimiter $$

create trigger ins_film

after insert on film for each row begin

insert into film_text (film_id, title, description)

values (new.film_id, new.title, new.description);

end;

$$delimiter ;

insert inot…on duplicate key update語句,觸發觸發器的順序

對於有重覆記錄,需要進行 update 操作的 insert,觸發器觸發的順序是 before insert、before update、after update;對於沒有重覆記錄的 insert,就

是簡單的執行 insert 操作,觸發器觸發的順序是 before insert、afterinsert。對於那些實際執行 update 操作的記錄,仍然會執行 before insert 觸發器的內容,在設計觸發器的時候一定要考慮這種情況,避免錯誤地觸發了觸發器。

範例mysql> insert into film values

-> (1002,'only test',

-> 'only test',2006,1,null,6,'0.99',86,'20.99','pg',

-> 'deleted scenes,behind the scenes','2006-02-15 05:03:42')

-> on duplicate key

-> update title='update record';

tips

1. 乙個表 相同的觸發時間的相同觸發事件只能建立乙個觸發器

2. 觸發器只能建立在永久表(permanent table)上,不能對臨時表(temporary table)建立觸發器。

13.2 刪除觸發器

一次可以刪除乙個觸發程式,如果沒有指定 schema_name,預設為當前資料庫

語法drop trigger [schema_name.]trigger_name 

範例要刪除 film 表上的觸發器 ins_film,可以使用以下命令:

mysql> drop trigger ins_film;

query ok, 0 rows affected (0.00 sec)

13.3 檢視觸發器

show triggers

範例mysql> show triggers \g

*************************** 1. row ***************************

trigger: customer_create_date

event: insert

table: customer

statement: set new.create_date = now()

timing: before

created: null

sql_mode:

strict_trans_tables,strict_all_tables,no_zero_in_date,no_zero_date,error_for_division_by_zer

o,traditional,no_auto_create_user

definer: root@localhost

*************************** 2. row ***************************

……查詢系統表的 information_schema.triggers 表

範例mysql> select * from triggers where trigger_name = 'ins_film_bef' \g

*************************** 1. row ***************************

trigger_catalog: null

trigger_schema: sakila

trigger_name: ins_film_bef

event_manipulation: insert

event_object_catalog: null

event_object_schema: sakila

event_object_table: film

action_order: 0

action_condition: null

action_statement: begin

insert into tri_demo (note) values ('before insert');

endaction_orientation: row

action_timing: before

action_reference_old_table: null

action_reference_new_table: null

action_reference_old_row: old

action_reference_new_row: new

created: null

sql_mode:

definer: root@localhost

1 row in set (0.01 sec)

13.4 觸發器的使用

觸發器執行的語句限制: 

1.觸發程式不能呼叫將資料返回客戶端的儲存程式,也不能採用call語句的動態sql語句,但是允許儲存過程通過引數將資料返回給觸發程式,也就是儲存過程或者函式通過out 或者inout 型別的引數將資料返回觸發器

2.不能在觸發器中使用以顯式或者隱式方式開始或者結束語句,如start transaction、 commit、rollback;

mysql 的觸發器是按照 before 觸發器、行操作、after 觸發器的順序執行的,其中任何一步操作發生錯誤都不會繼續執行剩下的操作。如果是對事務表進行的操作,那麼會整個作為乙個事務被回滾(rollback),但是如果是對非事務表進行的操作,那麼已經更新的記錄將無法回滾,這也是設計觸發器的時候需要注意的問題

深入淺出MySQL

說明索引的設計和使用 sql中的安全問題 常用sql技巧 sql優化過程 優化資料庫物件 鎖問題 本站 深入淺出mysql 個人部落格 深入淺出mysql 1 設計索引原則 2 小常識 3 btree索引 1 了解sql執行頻率 使用show session global statusa來獲得伺服器...

深入淺出Mysql(四)

大批量插入資料優化 1 對應myisam型別的表,可以通過以下方式快速的匯入大量資料 alter table tablname disable keys loading the data alter table tablname enable keys 這兩個命令用來開啟或者關閉myisam表非唯一...

深入淺出MySQL筆記(二)

本筆記為學習該書所記,便於複習。包含第三 四章筆記。資料型別與運算子 toc 整數型別 zerofill unsigned auto increment 浮點數型別 定點數型別 decimal m,d show warningsl 位型別bit m hex data datatime timesta...