本文由簡體中文內容自動轉碼而成。阿里雲不保證此自動轉碼的準確性、完整性及時效性。本文内容請以簡體中文版本為準。

含外鍵約束的處理方案

更新時間:2024-10-15 09:48

本文為您介紹如何規避源庫存在外鍵約束FOREIGN KEY REFERENCES ON DELETE CASCADEFOREIGN KEY REFERENCES ON UPDATE CASCADE所引發的資料不一致問題。

背景資訊

在使用了外鍵約束FOREIGN KEY REFERENCES ON DELETE CASCADEFOREIGN KEY REFERENCES ON UPDATE CASCADE的MySQL資料庫中,若刪除或更新父表的資料,則子表中關聯的資料將會自動被刪除或更新。在MySQL資料庫中,這些自動刪除或更新子表資料的操作不會被記錄到二進位日誌(Binlog)中。

影響

在使用Data Transmission Service進行含增量任務的資料移轉、資料同步、資料訂閱時,DTS會因無法從Binlog中擷取到這些刪除或更新操作,而無法遷移、同步、訂閱該刪除或更新操作,從而可能會導致資料不一致或資料丟失的問題(例如,目標資料庫中子表的資料量大於父表)。

涉及的鏈路

源庫的資料庫類型MySQLPolarDB for MySQLMariadbPolarDB-X 1.0PolarDB-X 2.0OceanBase(MySQL)

解決方案

本文為您提供手動管理刪除或更新操作和使用觸發器兩種方案,以規避該外鍵約束所引發的資料不一致問題。

重要

解決方案中提供的SQL語句為在Data Management中執行的命令,在其他MySQL用戶端中執行的SQL命令可能會有所差異。

樣本資料

父表
子表
-- 建立父表
CREATE TABLE parent (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- 插入一些資料
INSERT INTO parent (id, name) VALUES (1, 'Parent 1'), (2, 'Parent 2');
-- 建立含外鍵約束FOREIGN KEY REFERENCES ON DELETE CASCADE的子表
CREATE TABLE child (
    id INT PRIMARY KEY,
    parent_id INT,
    name VARCHAR(50),
    FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE
);

-- 插入一些資料
INSERT INTO child (id, parent_id, name) VALUES (1, 1, 'Child 1'), (2, 1, 'Child 2'), (3, 2, 'Child 3');

操作步驟

手動管理刪除或更新操作
使用觸發器

請先手動刪除或更新相關子表的資料,然後再刪除或更新父表的資料,以確保所有刪除或更新操作均被記錄在Binlog中。樣本如下:

-- 刪除父表記錄時手動刪除子表記錄
DELETE FROM child WHERE parent_id = 1;
DELETE FROM parent WHERE id = 1;

-- 更新父表記錄時手動更新子表記錄
UPDATE parent SET id = 3 WHERE id = 2;
UPDATE child SET parent_id = 3 WHERE parent_id = 2;

使用MySQL的觸發器,在刪除或更新父表資料時自動觸發對相應子表資料的刪除或更新操作,以確保所有刪除或更新操作均被記錄在Binlog中。樣本如下:

-- 建立觸發器
DELIMITER //

CREATE TRIGGER delete_parent_trigger
BEFORE DELETE ON parent
FOR EACH ROW
BEGIN
    DELETE FROM child WHERE parent_id = OLD.id;
END //

CREATE TRIGGER update_parent_trigger
AFTER UPDATE ON parent
FOR EACH ROW
BEGIN
    UPDATE child SET parent_id = NEW.id WHERE parent_id = OLD.id;
END //

DELIMITER ;

-- 插入一些資料
INSERT INTO parent (id, name) VALUES (3, 'Parent 3');
INSERT INTO child (id, parent_id, name) VALUES (4, 3, 'Child 4');

-- 刪除父表資料
DELETE FROM parent WHERE id = 3;

-- 插入一些資料並進行更新
INSERT INTO parent (id, name) VALUES (4, 'Parent 4');
INSERT INTO child (id, parent_id, name) VALUES (5, 4, 'Child 5');
UPDATE parent SET id = 5 WHERE id = 4;

總結

通過手動管理刪除或更新操作,或者使用資料庫的觸發器,確保在DTS執行個體運行過程中,MySQL中的外鍵約束FOREIGN KEY REFERENCES ON DELETE CASCADEFOREIGN KEY REFERENCES ON UPDATE CASCADE所需執行的刪除或更新操作可以被準確地記錄到Binlog中。

  • 本頁導讀 (1, M)
  • 背景資訊
  • 影響
  • 涉及的鏈路
  • 解決方案
  • 樣本資料
  • 操作步驟
  • 總結
文檔反饋
phone 聯絡我們

立即和Alibaba Cloud在線服務人員進行交談,獲取您想了解的產品信息以及最新折扣。

alicare alicarealicarealicare