觸發(fā)器是MySQL響應(yīng)一下任意語句而自動執(zhí)行的一條MySQL語句(或位于begin和end語句之間的一組語句):
- delete
- update
- insert
其他MySQL語句不支持觸發(fā)器
創(chuàng)建觸發(fā)器
在創(chuàng)建觸發(fā)器時,需要給出4條信息:
- 唯一的觸發(fā)器名;
- 觸發(fā)器關(guān)聯(lián)的表
- 觸發(fā)器應(yīng)該響應(yīng)的活動(delete、insert或update)
- 觸發(fā)器何時執(zhí)行(處理之前或之后)
insert觸發(fā)器
- insert觸發(fā)器代碼內(nèi),可引用一個名為new的虛擬表,訪問被插入的行
- 在before insert觸發(fā)器中,new中的值也可以被更新(允許更改插入的值)
- 對于auto_increment列,new在insert執(zhí)行之前包含0,在insert執(zhí)行之后包含新的自動生成值
//可以用來確定新生成值
create triger neworder after insert on orders
for each row select new.order_num;
注意:上面的例子在mysql 5.7(wamp下)測試不通過
delete觸發(fā)器
- 在delete觸發(fā)器代碼內(nèi),你可以引用一個名為old的虛擬表,訪問被刪除的行
- old中的值是只讀的
create trigger deleteorder before delete on orders
for each row
begin
insert into archive_orders(order_num, order_date, cust_id)
values(old.order_num, old,order_date, old.cust_id);
end;
update觸發(fā)器
- 在update觸發(fā)器代碼內(nèi),你可以引用一個名為old的虛擬表訪問以前的值,引用一個名為new的虛擬表訪問新更新的值
- 在before update觸發(fā)器內(nèi),new中的值可能也被更新(運(yùn)行更改將要用于update語句中的值)
- old中值全都是只讀的
create trigger updatevendor before update on vendors
for each row set new.vend_state = upper(new.vend_state);
參考書籍:
- MySQL必知必會