觸發器 是 MySQL 的數據庫對象之一,類似編程語言中的函數,但執行方式不同:它不由程序調用,也非手動啟動,而是由特定事件(INSERT、UPDATE、DELETE)自動觸發執行。
1. 學生表含「學生姓名」與「學生總數」字段,每新增一條記錄,總數自動遞增。
2. 顧客信息表需驗證電話格式、地址縮寫是否正確,插入時自動檢查。
總之,當表數據發生變更時,需自動執行數據校驗、聯動更新等操作。MySQL 約束機制無法實現字段取值範圍限制,觸發器恰好彌補此缺口。
1.
DELETE
2.INSERT
3.UPDATE
其他 SQL 語句不會激活觸發器。
一個表在相同觸發時間(BEFORE/AFTER)與相同事件下,只能創建一個觸發器。創建前需檢查是否已存在同名觸發器。
CREATE TRIGGER trigger_name BEFORE|AFTER trigger_event ON table_name FOR EACH ROW trigger_stmt
BEFORE / AFTER:指定觸發執行時機。
trigger_event:觸發事件(INSERT/UPDATE/DELETE)。
FOR EACH ROW:任一行滿足條件即觸發。
trigger_stmt:激活後執行的語句。
CREATE TABLE t_dept( deptno INT, dname VARCHAR(20), loc VARCHAR(20) ); CREATE TABLE t_diary( diaryno INT PRIMARY KEY, tablename VARCHAR(20), diarytime DATETIME ); CREATE TRIGGER tri_diarytime BEFORE INSERT ON t_dept FOR EACH ROW INSERT INTO t_diary VALUES(NULL, 't_dept', NOW()); INSERT INTO t_dept VALUES(1, 'cjgongdept', 'shanxi'); -- 驗證 SELECT * FROM t_diary;
需使用 DELIMITER 臨時修改語句結束符:
DELIMITER $$
CREATE TRIGGER tri_diarytime2
AFTER INSERT ON t_dept
FOR EACH ROW
BEGIN
INSERT INTO t_diary VALUES(NULL, 't_dept', NOW());
INSERT INTO t_diary VALUES(NULL, 't_dept', NOW());
END $$
DELIMITER ;
INSERT INTO t_dept VALUES(2, 'cjgongdept', 'shanxi');
-- 驗證
SELECT * FROM t_diary;
SHOW TRIGGERS\G
DROP TRIGGER trigger_name; SHOW TRIGGERS\G