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

SQL Server 與 MySQL 觸發器語法差異深度解析

     編輯:MySQL 資料庫相關知識

    測試資料表結構

    -- 分數表
    CREATE TABLE sc (
        ScId INT NOT NULL PRIMARY KEY,
        SNo INT NOT NULL,
        CNo INT NOT NULL,
        Score INT DEFAULT NULL
    );
    
    -- 異動記錄表
    CREATE TABLE score_record (
        SrId INT NOT NULL PRIMARY KEY,
        SNo INT NOT NULL,
        CNo INT NOT NULL,
        OldScore INT NOT NULL,
        NewScore INT NOT NULL,
        UpdateTime DATETIME NOT NULL
    );

    MySQL 觸發器寫法

    使用 NEW/OLD 伪表欄位,DELIMITER 變更語句結束符:

    DROP TRIGGER IF EXISTS `trigger_sr`;
    DELIMITER //
    CREATE TRIGGER `trigger_sr` AFTER UPDATE ON `sc`
    FOR EACH ROW
    BEGIN
        INSERT INTO score_record
        SET SNo = NEW.SNo,
            CNo = NEW.CNo,
            OldScore = OLD.Score,
            NewScore = NEW.Score,
            UpdateTime = NOW();
    END//
    DELIMITER ;

    SQL Server 觸發器寫法

    使用 INSERTED/DELETED 邏輯表,採 T-SQL 變數宣告與流程控制:

    CREATE TRIGGER trigger_sr ON sc
    FOR UPDATE
    AS
    DECLARE @SNo INT, @CNo INT, @OldScore INT, @NewScore INT;
    SELECT @SNo = SNo, @CNo = CNo, @OldScore = Score FROM DELETED;
    SELECT @NewScore = Score FROM INSERTED;
    INSERT INTO score_record (SNo, CNo, OldScore, NewScore, UpdateTime)
    VALUES (@SNo, @CNo, @OldScore, @NewScore, GETDATE());

    核心差異對照表

    特性MySQLSQL Server
    觸發時機關鍵字BEFORE / AFTERINSTEAD OF / AFTER (FOR)
    行級觸發FOR EACH ROW (預設)隱含行級,透過 INSERTED/DELETED 處理集合
    新/舊值引用NEW.col / OLD.colINSERTED.col / DELETED.col
    語句結束符需自訂 DELIMITER標準 GO 或分號
    變數宣告SET @var = ... 或 DECLARE 在 BEGIN 內DECLARE @var TYPE
    多行邏輯區塊BEGIN ... ENDBEGIN ... END
    取得當前時間NOW()GETDATE()

    進階觀察

    • MySQL 觸發器較貼近 SQL:2003 標準,語法相對簡潔。
    • SQL Server 的 INSERTED/DELETED 為虛擬表,可一次處理多筆異動,效能較佳但邏輯稍複雜。
    • 兩者在儲存程序、自訂函數、錯誤處理(TRY...CATCH vs DECLARE HANDLER)上差異更大。

    結語

    掌握一種資料庫的觸發器機制後,轉學另一種主要在「語法映射」與「集合 vs 行級思維」的切換。建議實作幾個實際業務案例(如稽核軌跡、衍生欄位維護、跨表同步)以深化理解。

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