MySQL必知必會 第25章 使用觸發器

2021-10-23 10:35:26 字數 2709 閱讀 6925

1.1 版本支援:mysql5以及之後版本;

1.2 定義

觸發器是mysql響應以下任意語句,自動執行的位於begin 和 end之間的一組sql語句;

1)insert;

2)delete;

3)update;

以上都是針對表內容的操作,檢視和臨時表都不支援觸發器;

其他mysql語句不支援觸發器

2.1 建立觸發器

1)給出唯一的觸發器名;

這裡的唯一指的是在「表」上唯一,即,不同的表的觸發器名字可以相同;

但是盡量在同乙個資料庫裡唯一,不同的表觸發器名字都不相同。

2)觸發器關聯的表;

3)觸發器響應的活動/操作/關鍵字(insert delete update);

4)觸發器執行的時間,在活動/操作之前或是之後

5)觸發的事件;

-- 建立觸發器的基本語法

create

trigger 觸發器名 -- 唯一的觸發器名

before|

after

-- 觸發器執行的時間

insert

|delete

|update

-- 觸發器響應的活動/操作/關鍵字

on 表名 -- 觸發器關聯的表

for each row

-- 增刪改可能一次性操作多行, 每行操作都會觸發

begin

-- 使用begin和end可以包裹一組sql語句觸發執行

select

'hello'

;-- 觸發的事件,每次觸發都顯示乙個'hello'

end;

【說明】

1)每個表每個事件每次(時間)只能定義乙個觸發器,因此每個表最多支援6個觸發器(每條insert、delete、update語句的之前之後3*2=6);

2)單個觸發器不能與多個時間或多張表關聯

3)如果before觸發器執行失敗,將不執行請求的語句;

4)如果before觸發器或是請求的語句執行失敗,則不執行after觸發器

2.2 insert觸發器

1)insert觸發器的**內,可以用名為new的虛擬表以new.列名的形式訪問被插入的行;(new表暫時儲存著之後要插入底層表的資料)

2)before觸發器中,new中的值可以被更新,這樣可以改變插入的值。

3)設定為自增的列,插入的values中若沒有給出指定的值,那麼在insert執行之前,new的這列為0,在insert完成之後,new的這列才包含新的自動生成的值;

例子:對插入的每行,在插入之後列印新生成的自增量

-- orders 包含3個列,第1列自增id,第2列訂單日期,第3列客戶id

create

trigger neworder

after

insert

on orders

for each row

select new.order_num;

注意

列印新生成new.自增量,只能通過after insert語句;

如果使用before語句,在還沒插入之前,如果自增列沒有指定的值,自增列返回的就是0,而不是新生成的自增量。

【說明】

before觸發器主要用於資料驗證和淨化,對於update觸發器也是如此

2.3 delete觸發器

1)在delete觸發器的**內,可以引用old虛擬表,訪問被刪除的行;

2)old表中的資料都是唯讀的,不能修改/更新;

例子:將要被刪除的行儲存到乙個備份表裡;

create

trigger delete_back_up

before

delete

on orders

for each row

begin

insert

into orders_back_up(order_num, order_date, cust_id)

values

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

;end

;

【說明】

1)使用before delete可以保證,如果存檔失敗,不執行請求的sql語句,即不刪除資料;

2)若使用after delete存檔失敗,就沒法復原了。

2.4 update觸發器

1)update觸發器的**中,可以使用old虛擬表訪問舊表的值,可以使用new虛擬表訪問新更新的值;

2)before update中,new的值可能被更新,允許更改用於update語句中的值;

3)old表中的值全是唯讀的,不能更新。

1)建立觸發器可能需要特殊的安全訪問許可權;

2)觸發器的執行是自動的,如果insert、delete、update能夠執行,相關的觸發器也能執行;

3)觸發器可用來建立審計跟蹤,把執行的sql語句都記錄到另乙個表中

4)觸發器應該用來保證資料的一致性(大小寫、格式等);

5)觸發器中不支援使用call語句呼叫儲存過程,想要執行儲存過程需要把儲存過程的**複製到觸發器內。

《MYSQL必知必會》第1 9章

資料庫基礎 資料庫 儲存有組織的資料的容器 表 某種特定型別資料的結構化清單 列 表中的乙個字段資料型別 所容許的資料的型別 行 表中的乙個記錄 主鍵 一列,其值能夠唯一區分表中每個行 sql是結構化查詢語言 structured query language 的縮寫 mysql 簡介 mysql是...

mysql必知必會 mysql必知必會(四)

十四 理解子查詢 1 通過子查詢過濾 這本書在所有的章節都關連到了資料庫表,訂單資料是儲存在兩個表中,orders表儲存著 訂單號碼 顧客id和訂單日期。個人的訂單列表關連著orderitems表,訂單表沒有儲存顧客資訊,它只是儲存著顧客id,這實際的顧客資訊是儲存在customers表中。現在假設...

《MySQL必知必會》第24章 有bug

有時候,需要在檢索出來的行中前進或後退一行或多行,這就是游標,游標是乙個儲存在mysql伺服器上的資料庫查詢,不是一條select語句,而是被該語句檢索出來的結果集 游標主要用於互動式應用,使用者可以滾動螢幕上的資料進行瀏覽或更改 mysql游標只能用於儲存過程 和函式 使用步驟為 1 宣告 定義 ...