日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

(2.13)Mysql之SQL基础——触发器

發(fā)布時間:2025/3/16 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (2.13)Mysql之SQL基础——触发器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

(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事件) (
3for 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。