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