(2.13)Mysql之SQL基础——触发器
(2.13)Mysql之SQL基礎(chǔ)——觸發(fā)器
關(guān)鍵詞:Mysql觸發(fā)器
?
二、觸發(fā)器
MySQL語句在需要時被執(zhí)行,存儲過程也是如此,如果希望某條語句(或某些語句)在事件發(fā)生時自動執(zhí)行,這就需要用到觸發(fā)器。
觸發(fā)器是MySQL響應以下任意語句而自動執(zhí)行的一條MySQL語句(或位于begin和end語句之間的一組語句):
delete;
insert;
update;
其他MySQL語句不支持觸發(fā)器。。。
1、創(chuàng)建觸發(fā)器
需要以下4條信息:
①唯一的觸發(fā)器名;
②觸發(fā)器關(guān)聯(lián)的表;
③觸發(fā)器應該響應的活動(delete、insert或update);
④觸發(fā)器何時執(zhí)行(處理之前或之后);
PS:MySQL中,觸發(fā)器名必須在每個表中唯一,但不限制每個數(shù)據(jù)庫中唯一,即:同一數(shù)據(jù)庫中兩個表可以具有相同名字的觸發(fā)器(其他的DBMS中不被允許)。
觸發(fā)器使用create teigger語句創(chuàng)建,下面是一個簡單的例子:
create trigger newproduct after insert on products
for each row select 'product added';
這里創(chuàng)建了一個newproduct的新觸發(fā)器,給出了after insert,所以此觸發(fā)器在insert語句成功執(zhí)行后執(zhí)行;其中還指定了for each row,因此代碼對每個插入行執(zhí)行。
PS:只有表才支持觸發(fā)器,視圖不支持(臨時表也不支持)。
? ? 觸發(fā)器按每個表每個事件每次的定義,每個表每個事件每次只允許一個觸發(fā)器;因此每個表最多支持6個觸發(fā)器(每條insert、update和delete的之前和之后),單一觸發(fā)器不能與多個事件或多個表關(guān)聯(lián)。
? ? 如果before觸發(fā)器失敗,則MySQL將不執(zhí)行請求的操作;此外,如果before觸發(fā)器或語句本身失敗,MySQL將不執(zhí)行after觸發(fā)器(如果有的話)。
?
2、刪除觸發(fā)器
刪除觸發(fā)器使用drop trigger語句,例如:
drop trigger newproduct;
PS:觸發(fā)器不能更新或覆蓋;為了修改一個觸發(fā)器,必須先刪后建。
?
3、使用觸發(fā)器
insert觸發(fā)器
使用insert觸發(fā)器,需要知道以下三點:
①在insert觸發(fā)器代碼內(nèi),可引用一個名為new的虛擬表,訪問被插入的行;
②在before insert觸發(fā)器內(nèi),new中的值也可以被更新(允許更改被插入的值);
③對于auto increment列,new在insert執(zhí)行之前包含0,在insert執(zhí)行之后包含新的自動生成值;
例子如下:
create trigger neworder after insert on ordersfor each row select new.order_num;?
此代碼創(chuàng)建一個名為neworder的觸發(fā)器,按照after insert on order執(zhí)行;在插入一條新的數(shù)據(jù)orders表時,MySQL生成一個新訂單號并保存到order_num中;
觸發(fā)器從new.order_num取這個值并返回它;此觸發(fā)器必須按照after insert執(zhí)行,因為在before insert語句執(zhí)行之前,新order_num還沒生成。
PS:通常將before用于數(shù)據(jù)驗證和凈化(目的是保證插入表中的數(shù)據(jù)確實是需要的數(shù)據(jù))。這個規(guī)則也適用于update觸發(fā)器。
delete觸發(fā)器
使用delete觸發(fā)器,需要知道以下兩點:
①在delete觸發(fā)器代碼內(nèi),可以引用一個名為old的虛擬表,訪問被刪除的行;
②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;?
此代碼在任意orders表中的數(shù)據(jù)被刪除前執(zhí)行此觸發(fā)器;它使用一條insert語句將old中的值(要被刪除的數(shù)據(jù))保存到一個名為archive_orders的存檔表中;
上面的例子中,使用begin end塊的好處是觸發(fā)器能容納多條SQL語句。
PS:使用before delete觸發(fā)器的優(yōu)點:如果由于某些原因,數(shù)據(jù)不能存檔,delete本身將被放棄。
update觸發(fā)器
使用update觸發(fā)器,需要知道以下三點:
①在update觸發(fā)器代碼內(nèi),可以引用一個名為old的虛擬表訪問以前(update語句前)的值,引用一個名為new的虛擬表訪問新更新的值;
②在before update觸發(fā)器中,new中的值可能也被更新(允許更改將要用于update語句中的值);
③old中的值全都是只讀的,不能更新;
下面的例子,保證了州名稱縮寫總是大寫:
create trigger updateevendor before update on vendors
for each row set.vend_state = upper(new.vend_state);
這個例子中,每次更新一個行時,new.vend_state中的值(將用來更新表行的值)都用upper(new.vend_state)替換。
?
△關(guān)于觸發(fā)器一些必須知道的知識:
①創(chuàng)建觸發(fā)器可能需要特殊的安全訪問權(quán)限,但觸發(fā)器的執(zhí)行是自動的;如果insert、update、delete語句可以執(zhí)行,則相應觸發(fā)器也能執(zhí)行;
②應該用觸發(fā)器來保證數(shù)據(jù)的一致性(大小寫、格式等);有點在于它總是進行這種處理,而且是透明的進行,與客戶機應用無關(guān);
③觸發(fā)器的一種非常有意義的使用是創(chuàng)建審計跟蹤。使用觸發(fā)器,把更改記錄到另一個表非常容易;
④MySQL觸發(fā)器不支持call語句,即不能從觸發(fā)器內(nèi)調(diào)用存儲過程,所需的存儲過程代碼需要復制到觸發(fā)器內(nèi)。
?
1、一般形式
-- 0.查看觸發(fā)器【1】SHOW TRIGGERS;
【2】SELECT * FROM `information_schema`.`TRIGGERS` WHERE `TRIGGER_NAME`='trg_bm_history';
-- 1.一般形式
create trigger trigger_name trigger_time trigger_event on table_name for each row begintrigger_statement; end解析: (1)trigger_time:觸發(fā)時間,取值[before/after]即事件發(fā)生之前/之后 (2)trigger_event:觸發(fā)時間,取值[insert/update/delete]即進行增/刪/改事件觸發(fā)該觸發(fā)器;
(注意replace以及l(fā)oad data等同于Insert事件) (3)for each row:關(guān)鍵字,對每一行進行觸發(fā);以行為單位;
(4)trigger_statement:觸發(fā)執(zhí)行語句
(5)old / new 關(guān)鍵字:可以獲取到操作之前、操作之后的行數(shù)據(jù),一般old用于after時刻,new多用于before時刻
【1】insert操作:一般只使用new,new為新插入的行的數(shù)據(jù)
【2】update操作:一般使用new和old,new為更新后的數(shù)據(jù)行,old為更新前的數(shù)據(jù)行
【3】delete操作:一般只用old,表示刪除前的數(shù)據(jù)行
-- 2.簡單案例
#刪除表之前使用觸發(fā)器把被刪除的表插入到歷史表備份
delimiter //
create trigger trg_bm_history after
delete on bm
for each row
begin
insert into bm_history values(old.b_id,old.b_name);
end //
delimiter ;
-- 3.刪除
drop trigger trigger_name;
-- 4.注意事項
【1】對于相同的表,相同的事件只能創(chuàng)建一個觸發(fā)器,比如對表 bm 創(chuàng)建了after delete 觸發(fā)器,就不能再對該表創(chuàng)建 after delete 觸發(fā)器了;
?
案例:插入數(shù)據(jù)前,記下當條記錄的其插入id+1;
delimiter // create trigger trg_bm_max before insert on bm for each row begin update dm_count set count_max=new.b_id+1; end // delimiter ;
轉(zhuǎn)載于:https://www.cnblogs.com/gered/p/10448017.html
總結(jié)
以上是生活随笔為你收集整理的(2.13)Mysql之SQL基础——触发器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 全栈开发,Day82(点赞
- 下一篇: 10个人有9个答错,另外1个只对一半:数