建立觸發器需要給出4條資訊:
1. 唯一的觸發器名;
2.觸發器關聯的表;
3.觸發器應該響應的活動(d,i,u)
4.觸發器何時執行(處理之前或之後)。
下面乙個簡單的例子
建立觸發器:
create trigger newproduct after insert on products for each row select 'product added';
後面的select語句是插入顯示的功能。
需要注意的是:只要表才支援觸發器,檢視是不支援觸發器的,臨時表也不支援。並且每個表的每個事件只允許乙個觸發器。因此每個表最多支援6個觸發器。單一觸發器不能與多個事件或多個表關聯,所以,如果你需要乙個對insert和update操作執行的觸發器,則應該定義兩個觸發器。
如果before觸發器失敗,則mysql將不執行請求的操作。此外,如果before觸發器或語句本身失敗,mysql將不執行after觸發器(如果有的話)。
刪除觸發器:
drop trigger newproduct;
觸發器不能更新和覆蓋。為了修改觸發器,必須先刪除它,然後在重新建立。
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;
是before 還是after ?通常,將before用於資料驗證和淨化(目的是保證插入表中的資料確實是需要的資料)
delete觸發器:
1.delete觸發器**內,你可以引用乙個名為old的虛擬表。訪問被刪除的行;
2.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;
使用before delete觸發器的優點(相對於after delete觸發器來說),如果由於某種原因,訂單不能存檔,delete本身將被放棄。正如所見,觸發器deleteorder觸發器使用了begin和end語句標記觸發器體。這在此例子中並不是必須的,不過使用begin end塊的好處是觸發器能容納多條sql語句。
update觸發器
1.在update觸發器**中,你可以引用乙個名為old的虛擬表,引用乙個new的虛擬表訪問新更新的值。
2.before update觸發器中,new中的值可能也被更新。
3.old中的值全都是唯讀的,不能更新。
保證州名都是大寫:
create trigger upatevendor before update on vendors for each row set new.vend_state=upper(new.vend_state);
遺憾的是mysql中觸發器中不支援call語句。這表示不能從觸發器內呼叫儲存過程。
MySQL必知必會讀書筆記二
暫時只更到檢視之前的內容了 後續的東西有機會再補 插入資料 insert into customers cust address,cust city,cust state,cust zip,cust country,cust contact,cust email values pep e 100 m...
mysql必知必會 讀書筆記
一.show命令 1.使用命令列 管理員方式 啟動mysql服務 net start mysql57 mysql57為安裝時取得名字 2.登陸本地mysql資料庫 mysql uroot p 3.顯示已有的資料庫 show databases 4.使用某資料庫 use users 5.先使用4命令 ...
讀書筆記 mysql必知必會 22
檢視是虛擬的表。與包含資料的表不一樣,檢視只包含使用時動態檢索資料的查詢 作為檢視,它不包含表中應該有的任何列或資料,它包含的是乙個sql 查詢 與上面用以正確聯結表的相同的查詢 重用 sql語句。簡化複雜的 sql操作。在編寫查詢後,可以方便地重用它而不必知道它的基本查詢細節。使用表的組成部分而不...