MySQL觸發器

<!-- END doctoc generated TOC please keep comment here to allow auto update -->php

觸發器的特性

  • 須要MySQL 5 對觸發器的支持是在MySQL 5中增長的
  • 僅支持表 只有表才支持觸發器,視圖不支持(臨時表也不支持)。
  • 保持每一個數據庫的觸發器名惟一 在MySQL 5中,觸發器名必須在每一個表中惟一,但不是在每一個數據庫中惟一。這表示同一數據庫中的兩個表可具備相同名字的觸發器。這在其餘每一個數據庫觸發器名必須惟一的DBMS中是不容許的,並且之後的MySQL版本極可能會使命名規則更爲嚴格。所以,如今最好是在數據庫範圍內使用惟一的觸發器名。
  • 觸發器失敗 若是BEFORE觸發器失敗,則MySQL將不執行請求的操做。此外,若是BEFORE觸發器或語句自己失敗,MySQL將不執行AFTER觸發器(若是有的的話)
  • BEFORE或AFTER 一般,將BEFORE用於數據驗證和淨化(目的是保證插入表中的數據確實是須要的數據)

觸發器的應用場景

須要在某個表發生更改時自動處理。html

例如:數據庫

  • 每當增長一個顧客到某個數據庫表時,都檢查其電話號碼格式是否正確,州的縮寫是否爲大寫;
  • 每當訂購一個產品時,都從庫存數量中減去訂購的數量;
  • 不管什麼時候刪除一行,都在某個存檔表中保留一個副本。

觸發器是MySQL響應如下任意語句而 自動執行的一條MySQL語句(或位於BEGIN和END語句之間的一組語 句):  DELETE;  INSERT;  UPDATE。安全


查看觸發器

  • 圖形化工具(MySQL workBench)
  • 終端 show triggers

刪除觸發器

DROP TRIGGER [trigger_name]

觸發器不能更新或覆蓋。爲了修改一個觸發器,必須先刪除它,而後再從新建立。函數


建立觸發器

在建立觸發器時,須要給出4條信息:  惟一的觸發器名;  觸發器關聯的表;  觸發器應該響應的活動(DELETE、INSERT或UPDATE);  觸發器什麼時候執行(處理以前或以後)。工具

經過出發條件和響應活動組合每張表最多能夠建立6個觸發器 編碼

  • 建立觸發器的語法以下
CREATE TRIGGER [trigger_name] [trigger_time] [trigger_event] ON [tb_name] FOR EACH ROW [trigger_stmt]

trigger_name:觸發器的名稱 tirgger_time:觸發時機,爲BEFORE或者AFTER trigger_event:觸發事件,爲INSERT、DELETE或者UPDATE tb_name:表示創建觸發器的代表,就是在哪張表上創建觸發器 trigger_stmt:觸發器的程序體,能夠是一條SQL語句或者是用BEGIN和END包含的多條語句spa

  • 建立有多個執行語句的觸發器
CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件
ON 表名 FOR EACH ROW
BEGIN
    執行語句列表
END

其中,BEGIN與END之間的執行語句列表參數表示須要執行的多個語句,不一樣語句用分號隔開3d

  • NEW和OLD的使用:


示例日誌

  • 用戶user表
CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
  `add_time` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `name` (`name`(250)) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1;
  • 日誌logs表
CREATE TABLE `logs` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `log` varchar(255) DEFAULT NULL COMMENT '日誌說明',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日誌表';
  • 觸發器
CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8;
DECLARE s2 VARCHAR(20) character set utf8;#後面發現中文字符編碼出現亂碼,這裏設置字符集
SET s2 = " is created";
SET s1 = CONCAT(NEW.name,s2);     #函數CONCAT能夠將字符串鏈接
INSERT INTO logs(log) values(s1);
END;

效果演示


關於觸發器的進一步介紹

  • 與其餘DBMS相比,MySQL 5中支持的觸發器至關初級。將來的MySQL版本中有一些改進和加強觸發器支持的計劃。
  • 建立觸發器可能須要特殊的安全訪問權限,可是,觸發器的執行是自動的。若是INSERT、UPDATE或DELETE語句可以執行,則相關的觸發器也能執行.
  • 應該用觸發器來保證數據的一致性(大小寫、格式等)。在觸發器中執行這種類型的處理的優勢是它老是進行這種處理,並且是透明地進行,與客戶機應用無關。
  • 觸發器的一種很是有意義的使用是建立審計跟蹤。使用觸發器,把更改(若是須要,甚至還有以前和以後的狀態)記錄到另外一個表很是容易
  • MySQL觸發器中不支持CALL語句。這表示不能從觸發器內調用存儲過程。所需的存儲過程代碼須要複製到觸發器內
  • 業務代碼VS觸發器?相對來講業務代碼更加容易維護,而觸發器速度更快.

參考博客:http://www.javashuo.com/article/p-evmoimxy-k.html 參考書籍:<<MySQL必知必會>>

相關文章
相關標籤/搜索