日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2025/3/16 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (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事件) (
3for 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基础——触发器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。