同一實例下兩個數據庫 a、b,各有一張結構相同的表 table1(id, val)、table2(id, val)。需求:a.table1 更新時,自動將變更同步到 b.table2。
DELIMITER $$
CREATE TRIGGER `a`.`trg_sync_table1_to_table2`
BEFORE UPDATE ON `a`.`table1`
FOR EACH ROW
BEGIN
-- 僅當主鍵 id 發生變化時同步(演示邏輯,實際常同步 val 等業務字段)
IF NEW.id <> OLD.id THEN
UPDATE `b`.`table2`
SET `b`.`table2`.id = NEW.id
WHERE `b`.`table2`.val = OLD.val;
END IF;
END$$
DELIMITER ;
BEFORE UPDATE:在主表行鎖持有期間執行,同步操作與主表更新在同一事務,保證原子性——主表回滾則同步自動回滾。NEW/OLD:引用新/舊行數據,NEW.id 為更新後值,OLD.val 為更新前值。DELIMITER $$:避免觸發器體內分號提前結束創建語句。`b`.`table2`,且當前用戶需擁有兩庫相應權限。| 工具 | 問題 | 解決 |
|---|---|---|
| phpMyAdmin | 創建觸發器頻繁報語法錯誤,無可視化向導 | 先在支持觸發器可視化的客戶端(如 SQLyog、DBeaver、DataGrip)創建並測試,再複製 SQL 到 phpMyAdmin 執行 |
| SQLyog (Java 客戶端) | 界面友好、可視化創建觸發器、自動處理 DELIMITER | 推薦作為開發調試首選工具 |
| MySQL Workbench | 官方工具、ER 圖、觸發器/存儲過程編輯器完善 | 生產環境 DBA 首選 |