使用觸發器
觸發器是MySQL響應以下任意語句而自動執行的一條MySQL語句(或位于BEGIN和END語句之間的一組語句):
DELETEINSERTUPDATE
1.創建觸發器
需要給出:
唯一的觸發器名;
觸發器關聯的表;
觸發器應該響應的活動(DELETE、INSERT或UPDATE);
觸發器何時執行(處理之前或之后)。
觸發器用CREATE TRIGGER語句創建
create trigger newPRoduct after insert on productsfor each row select 'Product added';CREATE TRIGGER用來創建名為newproduct的新觸發器。觸發器可在一個操作發生之前或之后執行,這里給出了AFTER INSERT,所以此觸發器將在INSERT語句成功執行后執行。這個觸發器還指定FOREACH ROW,因此代碼對每個插入行執行。在這個例子中,文本Productadded將對每個插入的行顯示一次。2.刪除觸發器使用DROP TRIGGER語句Drop Trigger newproduct;3.使用觸發器3.1 Insert觸發器在INSERT觸發器代碼內,可引用一個名為NEW的虛擬表,訪問被插入的行;在BEFORE INSERT觸發器中,NEW中的值也可以被更新(允許更改被插入的值);對于AUTO_INCREMENT列,NEW在INSERT執行之前包含0,在INSERT執行之后包含新的自動生成值。create trigger neWorder after insert on ordersfor each row select New.order_num;然而這樣寫是錯的。。。not allowed to return set from trigger因為在MySQL的Trigger中不能出現Select* from table 的形式,這樣會返回結果集。可以使用Select..into..的形式create trigger neworder after insert on ordersfor each row select New.order_num into @ee;insert into orders(order_date,cust_id)values(Now(),10001);select @ee;這樣可以正常輸出3.2 Delete觸發器在DELETE觸發器代碼內,你可以引用一個名為OLD的虛擬表,訪問被刪除的行;OLD中的值全都是只讀的,不能更新。DELIMITER //create trigger deleteorder before delete on ordersfor each rowbegin insert into archive_orders(order_num,order_date,cst_id) values(OLD.order_num,OLD.order_date,OLD.cust_id);end //DELIMITER ;使用OLD保存將要被刪除的行到一個存檔表中3.3 Updata觸發器在UPDATE觸發器代碼中,你可以引用一個名為OLD的虛擬表訪問以前(UPDATE語句前)的值,引用一個名為NEW的虛擬表訪問新更新的值;在BEFORE UPDATE觸發器中,NEW中的值可能也被更新(允許更改將要用于UPDATE語句中的值);OLD中的值全都是只讀的,不能更新。create trigger updatevndors before update on vendorsfor each row set NEW.vend_state = Upper(NEW.vend_state);這個例子保證州名縮寫總是大寫
新聞熱點
疑難解答