MySQL觸發(fā)器使用過程詳解
MySQL—觸發(fā)器
? 將兩個關聯(lián)的操作步驟寫到程序里面,并且要用事務包裹起來,確保兩個操作稱為一個原子操作,要么全部執(zhí)行,要么全部不執(zhí)行
? 創(chuàng)建一個觸發(fā)器,讓商品信息數(shù)據(jù)的插入操作自動觸發(fā)庫存數(shù)據(jù)的插入操作
? 觸發(fā)器是由 事件來觸發(fā) 某個操作,這些事件包括 INSERT 、 UPDATE 、 DELETE 事件。所謂事件就是指用戶的動作或者觸發(fā)某項行為。如果定義了觸發(fā)程序,當數(shù)據(jù)庫執(zhí)行這些語句時候,就相當于事件發(fā)生 了,就會 自動 激發(fā)觸發(fā)器執(zhí)行相應的操作。
創(chuàng)建觸發(fā)器
CREATE TRIGGER 觸發(fā)器名稱
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表明
FOR EACH ROW
觸發(fā)器執(zhí)行語句
說明:
表名 :表示觸發(fā)器監(jiān)控的對象。
BEFORE|AFTER :表示觸發(fā)的時間。BEFORE 表示在事件之前觸發(fā);AFTER 表示在事件之后觸發(fā)。
INSERT|UPDATE|DELETE :表示觸發(fā)的事件。
- INSERT 表示插入記錄時觸發(fā);
- UPDATE 表示更新記錄時觸發(fā);
- DELETE 表示刪除記錄時觸發(fā)。
觸發(fā)器執(zhí)行的語句塊 :可以是單條SQL語句,也可以是由BEGIN…END結構組成的復合語句塊。
DELIMITER // CREATE TRIGGER before_insert_test_tri BEFORE INSERT ON test_trigger FOR EACH ROW BEGIN INSERT INTO test_trigger_log(t_node) VALUES('before insert'); END // DELIMITER ; INSERT INTO test_trigger(t_node) VALUES('test..'); SELECT * FROM test_trigger; SELECT * FROM test_trigger_log;
DELIMITER // CREATE TRIGGER salary_check_trigger BEFORE INSERT ON emp FOR EACH ROW BEGIN DECLARE mgr_sal DOUBLE; SELECT salary INTO mgr_sal FROM emp WHERE employee_id = NEW.manager_id; IF NEW.salary > mgr_sal THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '薪資不得高于領導薪資'; END IF; END // DELIMITER ; DESC emp; INSERT INTO emp(employee_id,last_name,email,hire_date,job_id,salary,manager_id) VALUES(300,'test','tom@126.com',CURDATE(),'AD_VP',10000,103);
查看觸發(fā)器
查看當前數(shù)據(jù)庫所有觸發(fā)器的定義
mysql> SHOW TRIGGERS\G; *************************** 1. row *************************** Trigger: salary_check_trigger Event: INSERT Table: emp Statement: BEGIN DECLARE mgr_sal DOUBLE; SELECT salary INTO mgr_sal FROM emp WHERE employee_id = NEW.manager_id; IF NEW.salary > mgr_sal THEN SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '薪資不得高于領導薪資'; END IF; END Timing: BEFORE Created: 2023-02-28 15:46:44.71 sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION Definer: root@% character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: utf8_general_ci
查看當前數(shù)據(jù)庫中某個觸發(fā)器的定義
SHOW CREATE TRIGGER salary_check_trigger\G;
從系統(tǒng)庫information_schema的TRIGGERS表中查詢“salary_check_trigger”觸發(fā)器的信息。
SELECT * FROM information_schema.TRIGGERS\G;
刪除觸發(fā)器
DROP TRIGGER salary_check_trigger
觸發(fā)器優(yōu)缺點
優(yōu)點:
- 可以確保數(shù)據(jù)的完整性
- 可以幫助記錄操作日志
- 可以用在操作數(shù)據(jù)前,對數(shù)據(jù)進行合法性檢驗
缺點:
- 可讀性差
- ER salary_check_trigger
### 觸發(fā)器優(yōu)缺點
#### 優(yōu)點:
- 可以確保數(shù)據(jù)的完整性
- 可以幫助記錄操作日志
- 可以用在操作數(shù)據(jù)前,對數(shù)據(jù)進行合法性檢驗#### 缺點:
- 可讀性差
- 相關數(shù)據(jù)的變更,可能會導致觸發(fā)器錯誤
到此這篇關于MySQL觸發(fā)器使用過程詳解的文章就介紹到這了,更多相關MySQL觸發(fā)器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!