MySQL觸發器


觸發器的特性

  • 需要MySQL 5
    對觸發器的支持是在MySQL 5中增加的
  • 僅支持表
    只有表才支持觸發器,視圖不支持(臨時表也不支持)。
  • 保持每個數據庫的觸發器名唯一
    在MySQL 5中,觸發器名必須在每個表中唯一,但不是在每個數據庫中唯一。這表示同一數據庫中的兩個表可具有相同名字的觸發器。這在其他每個數據庫觸發器名必須唯一的DBMS中是不允許的,而且以后的MySQL版本很可能會使命名規則更為嚴格。因此,現在最好是在數據庫范圍內使用唯一的觸發器名。
  • 觸發器失敗
    如果BEFORE觸發器失敗,則MySQL將不執行請求的操作。此外,如果BEFORE觸發器或語句本身失敗,MySQL將不執行AFTER觸發器(如果有的的話)
  • BEFORE或AFTER
    通常,將BEFORE用於數據驗證和凈化(目的是保證插入表中的數據確實是需要的數據)

觸發器的應用場景

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

例如:

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

觸發器是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包含的多條語句

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

其中,BEGIN與END之間的執行語句列表參數表示需要執行的多個語句,不同語句用分號隔開

  • 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觸發器?相對來說業務代碼更加容易維護,而觸發器速度更快.

參考博客:https://www.cnblogs.com/phpper/p/7587031.html
參考書籍:<<MySQL必知必會>>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM