觸發器是mysql響應以下任意語句而自動執行的一條mysql語句(或位於begin和end語句之間的一組語句):
delete;
insert;
update;
其他mysql語句不支援觸發器。
建立觸發器
在建立觸發器時,需要給出4條資訊:
唯一的觸發器名;
觸發器關聯的表;
觸發器應該響應的活動(delete、insert或update);
觸發器何時執行(處理之前或之後)。
保持每個資料庫的觸發器名唯一 在mysql 5中,觸發器名必須在每個表中唯一,但不是在每個資料庫中唯一。這表示同一資料庫中的兩個錶可具有相同名字的觸發器。這在其他每個資料庫觸發器名必須唯一的dbms中是不允許的。
create trigger newproduct after insert on products
for each row select 'product added' into @asd
create trigger用來建立名為newproduct的新觸發器。觸發器可在乙個操作發生之前或之後執行,這裡給出了after insert,所以此觸發器將在insert語句成功執行後執行。這個觸發器還指定for each row,因此**對每個插入行執行。在這個例子中,文字productadded將對每個插入的行顯示一次。
僅支援表 只有表才支援觸發器,檢視不支援(臨時表也不支援)。
觸發器按每個表每個事件每次地定義,每個表每個事件每次只允許乙個觸發器。因此,每個表最多支援6個觸發器(每條insert、update和delete的之前和之後)。單一觸發器不能與多個事件或多個表關聯,所以,如果你需要乙個對insert和update操作執行的觸發器,則應該定義兩個觸發器。
觸發器失敗 如果before觸發器失敗,則mysql將不執行請求的操作。此外,如果before觸發器或語句本身失敗,mysql將不執行after觸發器(如果有的話)。
刪除觸發器
drop trigger newproduct;
觸發器不能更新或覆蓋。為了修改乙個觸發器,必須先刪除它,然後再重新建立。
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 @asd;
此**建立乙個名為neworder的觸發器,它按照after inserton orders執行。在插入乙個新訂單到orders表時,mysql生成乙個新訂單號並儲存到order_num中。觸發器從new. order_num取得這個值並儲存變數@asd中。此觸發器必須按照after insert執行,因為在beforeinsert語句執行之前,新order_num還沒有生成。對於orders的每次插入使用這個觸發器將總是返回新的訂單號。
insert into orders(order_date,cust_id)values (now(),10001);
select @asd;
delete 觸發器
在delete觸發器**內,你可以引用乙個名為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;
在任意訂單被刪除前將執行此觸發器。它使用一條insert語句將old中的值(要被刪除的訂單)儲存到乙個名為archive_orders的存檔表中。
update 觸發器
在update觸發器**中,你可以引用乙個名為old的虛擬表訪問以前(update語句前)的值,引用乙個名為new的虛擬表訪問新更新的值;
在before update觸發器中,new中的值可能也被更新(允許更改將要用於update語句中的值);
old中的值全都是唯讀的,不能更新。
create trigger updatevendor before update on vendors
for each row set new.vend_state=upper(new.vend_state);
顯然,任何資料淨化都需要在update語句之前進行,就像這個例子中一樣。每次更新乙個行時,new.vend_state中的值(將用來更新錶行的值)都用upper(new.vend_state)替換。
關於觸發器的進一步介紹
建立觸發器可能需要特殊的安全訪問許可權,但是,觸發器的執行是自動的。如果insert、update或delete語句能夠執行,則相關的觸發器也能執行。
應該用觸發器來保證資料的一致性(大小寫、格式等)。在觸發器中執行這種型別的處理的優點是它總是進行這種處理,而且是透明地進行,與客戶機應用無關。
觸發器的一種非常有意義的使用是建立審計跟蹤。使用觸發器,把更改(如果需要,甚至還有之前和之後的狀態)記錄到另乙個表非常容易。
遺憾的是,mysql觸發器中不支援call語句。這表示不能從觸發器內呼叫儲存過程。所需的儲存過程**需要複製到觸發器內。
my sql 觸發器 mysql建立觸發器
首先,我們來了解一下什麼是觸發器,觸發器,就是在對一張表資料進行增 insert 刪 delete 改 update 的時候,為了保持資料的一致性,對別的表也要進行相應的資料修改。我們都知道mysql最後事務提交後,資料是會儲存到磁碟上的,那麼每次在insert,delete,update時候舊資料...
my sql 觸發器 MySQL檢視觸發器
檢視觸發器是指檢視資料庫中已經存在的觸發器的定義 狀態和語法資訊等。mysql 中檢視觸發器的方法包括 show triggers 語句和查詢 information schema 資料庫下的 triggers 資料表等。本節將詳細介紹這兩種檢視觸發器的方法。show triggers語句檢視觸發器...
mysql 觸發器定義 mysql觸發器
什麼是觸發器 觸發器是與表有關的資料庫物件,在滿足定義條件時觸發,並執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性。舉個例子,比如你現在有兩個表 使用者表 和 日誌表 當乙個使用者被建立的時候,就需要在日誌表中插入建立的log日誌,如果在不使用觸發器的情況下,你需...