mysql筆記25:使用觸發器
觸發器: 當我們希望在事件之前或者之後自動執行操作時,我們可以設定觸發器,觸發器可在設定以下事件之前或者之後:
- delete
- insert
- update
25.1 建立觸發器
-- 下面建立的觸發器在每次對products表的某一行插入之後都會列印"insert a row"
create trigger newproduct after insert on products
for each row select "insert a row";
25.2 刪除觸發器
drop trigger newproduct;
幾種不同的觸發器的特點
insert觸發器
insert觸發器有以下特點:
- 在insert觸發器程式碼中,可以引用名為NEW的虛擬表去訪問插入行
- 在before insert觸發器中,new的值也可以被更新
- 對auto_increment列,new表該列在insert之前包含0,在insert之後包含新的自動生成的值
示例:
create trigger neworder after insert on orders
for each row select new.order_num into @lastid;
before觸發器一般用於資料驗證和資料淨化
delete觸發器
在delete之前和之後,可以通過old表來訪問被刪除的行,old表的資料是隻讀的。
例如下面的觸發器用於在刪除之前,將資料插入到備份表中
create trigger deleteorder before delete on orders
for each row
begin
insert into archieve_orders(order_num, order_date, cust_id) values (old.order_num, old.order_date, old.cust_id);
end;
儘量使用delete before而不是delete after觸發器,前者在觸發器語句失敗時,不會執行刪除語句。保證了資料的安全
update觸發器
update觸發器在update語句執行之前和執行之後執行。
update觸發器具備以下特點:
- 在觸發器(無論是before還是after)程式碼中,可以用old訪問update之前的值,而用new表訪問之後的值
- 即便是before update觸發器,還沒有update時,也可以修改new表
- old表的值都是隻讀的無法更新
如以下觸發器對update語句的vend_state進行修飾,將其全置為大寫:
create trigger updatevendor before update on vendors
for each row set new.vend_state = update(new.vend_state);