觸發器是針對特定表的特定事件(INSERT/UPDATE/DELETE)自動執行的程式碼。MySQL 5.0+ 引入,5.x 版本持續增強。
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
trigger_body
BEFORE/AFTER:事件前/後執行FOR EACH ROW:逐列觸發(MySQL 僅支援行級)NEW:新資料行(INSERT/UPDATE 可用)OLD:舊資料行(UPDATE/DELETE 可用)表 data(name VARCHAR(255)) 插入新名稱時,自動更新 chars(count INT) 累計字元數。
CREATE TABLE data (name VARCHAR(255));
CREATE TABLE chars (count INT);
INSERT INTO chars VALUES (0);
CREATE TRIGGER t1 AFTER INSERT ON data
FOR EACH ROW
UPDATE chars SET count = count + CHAR_LENGTH(NEW.name);
mysql> SHOW TRIGGERS\G
Trigger: t1
Event: INSERT
Table: data
Statement: UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)
Timing: AFTER
mysql> INSERT INTO data VALUES ('Alice'), ('Bob'), ('Charlie');
mysql> SELECT * FROM chars;
+-------+
| count |
+-------+
| 15 | -- 5+3+7
+-------+
CREATE TABLE audit_log (
id INT AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(64),
operation ENUM('INSERT','UPDATE','DELETE'),
old_data JSON,
new_data JSON,
user VARCHAR(64),
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TRIGGER audit_users AFTER INSERT ON users
FOR EACH ROW
INSERT INTO audit_log (table_name, operation, new_data, user)
VALUES ('users', 'INSERT', CAST(CONCAT('{"id":',NEW.id,',"name":"',NEW.name,'"}') AS JSON), CURRENT_USER());
CREATE TRIGGER audit_users_upd AFTER UPDATE ON users
FOR EACH ROW
INSERT INTO audit_log (table_name, operation, old_data, new_data, user)
VALUES ('users', 'UPDATE',
CAST(CONCAT('{"id":',OLD.id,',"name":"',OLD.name,'"}') AS JSON),
CAST(CONCAT('{"id":',NEW.id,',"name":"',NEW.name,'"}') AS JSON),
CURRENT_USER());
CREATE TRIGGER calc_total BEFORE INSERT ON orders
FOR EACH ROW
SET NEW.total = NEW.qty * NEW.price * (1 - IFNULL(NEW.discount,0));
CREATE TRIGGER sync_profile AFTER UPDATE ON users
FOR EACH ROW
UPDATE profiles SET email=NEW.email WHERE user_id=NEW.id;
SHOW TRIGGERS;
SHOW TRIGGERS FROM dbname;
SHOW CREATE TRIGGER trigger_name;
DROP TRIGGER [IF EXISTS] trigger_name;
SELECT 回傳結果,改寫入臨時表或日誌表SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='...' 拋出自定義錯誤(5.5+)FOR EACH STATEMENT)COMMIT、LOCK TABLES 等)mysqldump 預設包含觸發器(--triggers)