首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 觸發器實戰範本:INSERT/UPDATE/DELETE 三種事件完整代碼

     編輯:MySQL 綜合教學

場景:主表異動自動同步到歷史表

  • test:主表(id, name, type, create_time)
  • test_hisy:歷史表(同結構 + operation 欄位)

建表語句

DELIMITER //
DROP TRIGGER IF EXISTS trg_test_after_insert//
CREATE TRIGGER trg_test_after_insert
AFTER INSERT ON `test`
FOR EACH ROW
BEGIN
  IF NEW.type = '1' THEN
    INSERT INTO `test_hisy` (`name`, `type`, `create_time`, `operation`)
    VALUES (NEW.`name`, NEW.`type`, NEW.`create_time`, 'insert');
  END IF;
END//
DELIMITER ;

觸發器 2:BEFORE UPDATE — 修改前記錄舊值

DELIMITER //
DROP TRIGGER IF EXISTS trg_test_before_update//
CREATE TRIGGER trg_test_before_update
BEFORE UPDATE ON `test`
FOR EACH ROW
BEGIN
  IF NEW.type = '2' THEN
    INSERT INTO `test_hisy` (`name`, `type`, `create_time`, `operation`)
    VALUES (OLD.`name`, OLD.`type`, OLD.`create_time`, 'update');
  END IF;
END//
DELIMITER ;

觸發器 3:BEFORE DELETE — 刪除前歸檔

DELIMITER //
DROP TRIGGER IF EXISTS trg_test_before_delete//
CREATE TRIGGER trg_test_before_delete
BEFORE DELETE ON `test`
FOR EACH ROW
BEGIN
  INSERT INTO `test_hisy` (`name`, `type`, `create_time`, `operation`)
  VALUES (OLD.`name`, OLD.`type`, OLD.`create_time`, 'delete');
END//
DELIMITER ;

關鍵點速查

事件可用欄位典型用途能否修改 NEW
BEFORE INSERTNEW資料清洗、補預設值、驗證✅ 是
AFTER INSERTNEW同步、日誌、衍生表維護❌ 否
BEFORE UPDATEOLD, NEW比對變化、記錄舊值、阻止非法改✅ 是
AFTER UPDATEOLD, NEW同步、審計、觸發下游❌ 否
BEFORE DELETEOLD歸檔、檢查關聯、軟刪除標記❌ 否
AFTER DELETEOLD清理關聯、統計更新❌ 否

驗證測試

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved