語法:CREATE TRIGGER name timing event ON table FOR EACH ROW statement
-- 在 t_user 插入前,自動記錄時間到 trigger_time 表
CREATE TRIGGER t_user_trig
BEFORE INSERT ON t_user
FOR EACH ROW
INSERT INTO trigger_time VALUES (NOW());
測試:
INSERT INTO t_user VALUES (2, 'wang', 0, 'abcdef', NOW(), 'a');
SELECT * FROM trigger_time;
-- 輸出:插入時刻的一行記錄
DELIMITER &&
CREATE TRIGGER t_user_trig_del
AFTER DELETE ON t_user
FOR EACH ROW
BEGIN
INSERT INTO trigger_time VALUES ('2000-01-01 10:10:00');
INSERT INTO trigger_time VALUES ('2001-01-01 11:11:00');
END &&
DELIMITER ;
關鍵點:
DELIMITER && 將語句結束符暫改為 &&,避免 BEGIN...END 內部 ; 被誤判為結束。BEGIN ... END 包裹多條語句。DELIMITER ; 恢復默認分隔符。
-- 查看指定觸發器詳細定義
SELECT * FROM information_schema.triggers WHERE trigger_name = 't_user_trig';
-- 查看當前庫所有觸發器
SHOW TRIGGERS;
DROP TRIGGER IF EXISTS t_user_trig;
DROP TRIGGER IF EXISTS t_user_trig_del;
IF @in_trigger IS NULL THEN SET @in_trigger=1; ... SET @in_trigger=NULL; END IF;。mysqldump --triggers 導出,遷移時檢查 DEFINER 權限(參考 1449 錯誤處理)。SHOW STATUS LIKE 'Trigger%' 觀察觸發頻率。updated_at = NOW()、計數器增減)。一句話總結: 觸發器是「資料庫層面的 AOP」,用得好是利器,用得重是毒藥——保持輕量、防遞歸、做監控。