表 test 插入資料時,自動同步插入到表 tem(結構相同)。
CREATE TRIGGER insert_test ON test
FOR INSERT
AS
BEGIN
INSERT INTO tem
SELECT * FROM inserted; -- inserted 為虛擬表,含新增列
END;
GO
FOR INSERT、虛擬表 inserted / deleted。AFTER / INSTEAD OF。DELIMITER //
CREATE TRIGGER insert_test
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
INSERT INTO tem (id, name) VALUES (NEW.id, NEW.name);
END //
DELIMITER ;
BEFORE/AFTER、FOR EACH ROW、NEW / OLD 關鍵字引用新/舊列值。DELIMITER 變更結束符號。INSTEAD OF 觸發器(僅視圖可用)。| 特性 | SQL Server | MySQL |
|---|---|---|
| 觸發時機 | AFTER / INSTEAD OF | BEFORE / AFTER |
| 行級觸發 | 隱含(集合式) | 強制 FOR EACH ROW |
| 新舊值引用 | inserted / deleted 虛擬表 | NEW.col / OLD.col |
| 多行插入 | 單次觸發,虛擬表含多列 | 逐行觸發(每行執行一次) |
| 結束符號 | GO / ; | 自訂 DELIMITER |
| 交易控制 | 隱含在同一交易 | 同一交易,BEFORE 可阻止操作 |
BEFORE 觸發器可用 SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '...'; 阻止操作。DROP TRIGGER 提升效能。