3

我正在開發一個工具來合併具有相同模式但不同數據的兩個數據庫。MySQL - ON更新CASCADE + foreign_key_checks = 0

它的一部分是將所有外鍵都更改爲ON UPDATE CASCADE,然後遞增所有主鍵以避免衝突並保持外鍵指針正常工作。

我的問題是,有時有破碎的FK一些孤立的行,因此下面的查詢:

UPDATE table set pk = pk + 1000000 

失敗是這樣的: ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails ... (儘管我還沒有考慮外商接觸!鍵列)

我希望把它們關掉由:

Set foreign_key_checks=0 

但隨後相關的F外鍵不更新。我做了一個快速測試,在設置foreign_key_checks = 0後級聯不起作用。

有沒有什麼辦法可以觸發級聯,或者在沒有設置foreign_key_checks=0的情況下執行破壞FK的行更新? UPDATE IGNORE如果關係是複合型不解決這個問題:(

回答

1

你應該先解決參照完整性。

  1. 刪除孤兒行
  2. 更新FK字段設置爲null,否則

之後,您的操作將可以正常工作。

附加信息:

如果該列爲NOT NULL,則表示該關係爲1 *。在這種情況下,您必須在父表中添加一個虛擬行(比如「VIRTUAL PARENT」行),並將所有指向未知父節點的fks更新爲這一行。這將允許您稍後處理數據,並且可以輕鬆地檢索它們。

如果您認爲1 *不是必需的(0 *對於您的技術/應用層就足夠了),那麼只需將該列設置爲空即可。

+0

總的想法很好, – adamziel

+0

oops我還沒寫完; 將fk字段更新爲空 - 當fk列不爲空時,這會失敗;我不想刪除整行,因爲它可能包含一些重要的數據; 似乎我可以改變這一列,並不是空的,但也許有另一種解決方案呢? – adamziel

+0

看到我更新的帖子('附加信息'部分) – Sebas