MySQL 使用觸發器

2021-10-20 16:24:38 字數 3608 閱讀 9395

mysql語句在需要時被執行,儲存過程也是如此。但是,如果你想要某條語句(或某些語句)在事件發生時自動執行,怎麼辦呢?例如:

所有這些例子的共同之處就是他們都需要在某個表發生更改時自動處理。這確切地說就是觸發器。觸發器是mysql響應以下任意語句而自動執行的一條mysql語句(或位於begin和end語句之間的一組語

句)):

其他mysql語句不支援觸發器。

在建立觸發器時,需要給出4條資訊:

保持每個資料庫的觸發器名唯一在mysql 5中,觸發器名必須在每個表中唯一,但不是在每個資料庫中唯一。這表示同一資料庫中的兩個錶可具有相同名字的觸發器。這在其他每個資料庫觸發器名必須唯一的dbms中是不允許的,而且以後的mysql版本很可能會使命名規則更為嚴格。因此,現在最好是在資料庫範圍內使用唯一的觸發器名。

觸發器用create trigger語句建立。下面是乙個簡單的例子:

create

trigger newproduct after

insert

on products for each row

select

'product added'

;

create trigger用來建立名為newproduct的新觸發器。觸發器可在乙個操作發生之前或之後執行,這裡給出了after insert,所以此觸發器將在insert語句成功執行後執行。這個觸發器還指定for each row,因此**對每個插入行執行。在這個例子中,文字product added將對每個插入的行顯示一次。

為了測試這個觸發器,使用insert語句新增一行或多行到products中,你將看到對每個成功的插入,顯示product added訊息。

僅支援表只有表才支援觸發器,檢視不支援(臨時表也不支援)。

觸發器按每個表每個事件每次地定義,每個表每個事件每次只允許乙個觸發器。因此,每個表最多支援6個觸發器(每條insert、 update和delete的之前和之後)。單一觸發器不能與多個事件或多個表關聯,所以,如果你需要乙個對insert和update操作執行的觸發器,則應該定義兩個觸發器。

觸發器失敗如果before觸發器失敗,則mysql將不執行請求的操作。此外,如果before觸發器或語句本身失敗, mysql將不執行after觸發器(如果有的話)。

現在,刪除觸發器的語法應該很明顯了。為了刪除乙個觸發器,可使用drop trigger語句,如下所示:

drop

trigger newproduct

觸發器不能更新或者覆蓋。為了修改乙個觸發器,必須先刪除它,然後在重新建立。

在有了前面的基礎知識後,我們現在來看所支援的每種觸發器型別以及它們的差別。

insert觸發器在insert語句執行之前或之後執行。需要知道以下幾點:

下面舉乙個例子(乙個實際有用的例子)。 auto_increment列具有mysql自動賦予的值。

create

trigger neworder after

insert

on orders for each row

select

new.order_num;

此**建立乙個名為neworder的觸發器,它按照after insert on orders執行。在插入乙個新訂單到orders表時, mysql生成乙個新訂單號並儲存到order_num中。觸發器從new. order_num取得這個值並返回它。此觸發器必須按照after insert執行,因為在beforeinsert語句執行之前,新order_num還沒有生成。對於orders的每次插入使用這個觸發器將總是返回新的訂單號。

為測試這個觸發器,試著插入一下新行,如下所示:

insert

into orders(order_date,cust_id)

values

(now()

,10001

);

orders 包 含 3 個 列 。 order_date 和 cust_id 必 須 給 出 ,order_num由mysql自動生成,而現在order_num還自動被返回。

before或after?通常,將before用於資料驗證和淨化(目的是保證插入表中的資料確實是需要的資料)。本提示也適用於update觸發器。

delete觸發器在delete語句執行之前或之後執行。需要知道以下兩點:

下面的例子演示使用old儲存將要被刪除的行到乙個存檔表中:

create

trigger deleteorder before delete

on orders for each row

begin

insert

into archive_orders(order_num,order_date,cust_id)

# 引用乙個名為old的虛擬表,訪問被刪除的行

values

(old.order_num,old.order_date,old.cust_id)

;end

在任意訂單被刪除前將執行此觸發器。它使用一條insert語句將old中的值(要被刪除的訂單)儲存到乙個名為archive_orders的存檔表中(為實際使用這個例子,你需要用與orders相同的列建立乙個名為archive_orders的表)。

使用before delete觸發器的優點(相對於after delete觸發器來說)為,如果由於某種原因,訂單不能存檔, delete本身將被放棄。

多語句觸發器正如所見,觸發器deleteorder使用begin和end語句標記觸發器體。這在此例子中並不是必需的,不過也沒有害處。使用begin end塊的好處是觸發器能容納多條sql語句(在begin end塊中一條挨著一條)。

update觸發器在update語句執行之前或之後執行。需要知道以下幾點:

下面的例子保證州名縮寫總是大寫(不管update語句中給出的是大寫還是小寫):

# update觸發器

# 在更新vendors表中的vend_state值時,插入前先修改為大寫格式

create

trigger updatevendor before update

on vendors

for each row

set new.vend_state = upper(new.vend_state)

;# 更新1001**商的州為china

update vendors set vend_state =

'china'

where vend_id =

1001

;# 檢視update後資料,1001**商對應的vend_state自動更新為大寫的china

select

*from vendors;

顯然, 任 何資料淨化都需要在update語句之前進行,就像這個 例 子 中一樣。每次更新乙個行時, new.vend_state中的值(將用來更新錶行的值)都用upper(new.vend_state)替換。

我們再介紹一些使用觸發器時需要記住的重點。

mysql 觸發器 觸發器使用

1 了解什麼是觸發器?mysql 的觸發器和儲存過程一樣,都是嵌入到mysql的一段程式,觸發器 是由事件觸發某個動作,這些事件包括,插入 更新 刪除等語句。如果定義了觸發程式,觸發器就會觸發執行相應的操作。觸發器 trigger 是個特殊的儲存過程,不同的是,執行儲存過程要使用call語句來呼叫,...

觸發器 mysql觸發器

觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...

MySQL 使用觸發器

如果你想要某些語句在事件發生時自動執行,比如 這是我們就可以用到觸發器了。觸發器可以響應 delete,update,insert 在建立觸發器時,需要給出4條資訊 而且觸發器名必須在每個表中唯一,但不是在每個資料庫中唯一。這表示同一資料庫中的兩個錶可具有相同名字的觸發器。create trigge...