1. 程式人生 > 其它 >mysql筆記25:使用觸發器

mysql筆記25:使用觸發器

觸發器: 當我們希望在事件之前或者之後自動執行操作時,我們可以設定觸發器,觸發器可在設定以下事件之前或者之後:

  1. delete
  2. insert
  3. 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觸發器有以下特點:

  1. 在insert觸發器程式碼中,可以引用名為NEW的虛擬表去訪問插入行
  2. 在before insert觸發器中,new的值也可以被更新
  3. 對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觸發器具備以下特點:

  1. 在觸發器(無論是before還是after)程式碼中,可以用old訪問update之前的值,而用new表訪問之後的值
  2. 即便是before update觸發器,還沒有update時,也可以修改new表
  3. old表的值都是隻讀的無法更新

如以下觸發器對update語句的vend_state進行修飾,將其全置為大寫:
create trigger updatevendor before update on vendors
for each row set new.vend_state = update(new.vend_state);