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 宣告 定義 ...