首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 觸發器完整實例:INSERT/UPDATE/DELETE 同步備份表、NEW/OLD 伪表列用法

     編輯:MySQL 資料庫相關知識

MySQL 觸發器可在資料異動前/後自動執行邏輯。本文提供完整建表、三類觸發器(AFTER INSERT、BEFORE UPDATE、BEFORE DELETE)、NEW/OLD 伪表列用法、DELIMITER 處理。

測試表結構

-- 主表
CREATE TABLE `test` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(100) NOT NULL DEFAULT '',
    `type` VARCHAR(100),
    `create_time` DATETIME,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 歷史/備份表
CREATE TABLE `test_hisy` (
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(100) NOT NULL DEFAULT '',
    `type` VARCHAR(100),
    `create_time` DATETIME,
    `operation` VARCHAR(100) COMMENT '操作類型',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

1. AFTER INSERT:新增同步(type='1' 才備份)

DELIMITER //
DROP TRIGGER IF EXISTS t_after_insert_test//
CREATE TRIGGER t_after_insert_test
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:修改前備份舊值(type='2' 才備份)

DELIMITER //
DROP TRIGGER IF EXISTS t_before_update_test//
CREATE TRIGGER t_before_update_test
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 t_before_delete_test//
CREATE TRIGGER t_before_delete_test
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 / OLD 伪表列速查

觸發時機選擇指南

觸發時機NEWOLD
INSERT新列值 ✅不可用 ❌
UPDATE修改後新值 ✅修改前舊值 ✅
DELETE不可用 ❌被刪除舊值 ✅
需求建議時機原因
驗證/修正新資料BEFORE INSERT/UPDATE可在寫入前攔截、修改 NEW 值
同步/記錄/通知AFTER INSERT/UPDATE/DELETE確保主操作成功才執行
備份被刪/修改前的值BEFORE DELETE/UPDATEOLD 仍可用,AFTER 後資料已變

⚠️ 限制與注意

  • 觸發器內**不能**呼叫 COMMIT/ROLLBACK/START TRANSACTION
  • 觸發器錯誤會導致主操作失敗(回滾)
  • 避免觸發器中查詢/修改同一張表(易造成死鎖或遞迴)
  • SHOW TRIGGERS 查看現有觸發器
  • MySQL 5.7+ 支援多觸發器同一事件/時機,有執行順序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved