我需要同步來自不同Firebird數據庫的兩個表中的數據。確切地說,我需要使用表Users(第二DB)的記錄更新表Person(1st DB)中的記錄。不僅「名稱」,「電子郵件」,「生日」,但ID也(!)。問題在於 - 有些表通過FOREIGN KEY約束依賴於Person的ID。外鍵參考目標不存在
我試圖做到這一點:
- 刪除外的從屬表鍵約束。
- 同步兩個表(這意味着更新/更改表Person中的ID)
- 更改從屬表中的相應ID。
- 在從屬表中添加外鍵約束。
最後一步會導致錯誤(日誌從Java應用程序,但它是相同的,如果我執行這些步驟直接IBExpert):
com.bssys.db.jdbc.DBSQLException: GDS Exception. 335544466. violation of FOREIGN KEY constraint "FK_EMPLOYEE_PERSON" on table "EMPLOYEE"
Foreign key reference target does not exist, error code: HY000
Reason: violation of FOREIGN KEY constraint "FK_EMPLOYEE_PERSON" on table "EMPLOYEE"
(員工 - 是從屬表之一)
我的問題是,我是否可以避免這個錯誤。或者,也許有關於如何更改相關表中的ID的一些想法。可能有特殊的RDBMS工具來同步數據庫,但我需要通過Java應用程序同步它們,因此只使用sql和java。我使用Firebird 2.5.1。
完整的SQL語句(例如):
ALTER TABLE employee DROP CONSTRAINT fk_employee_person
UPDATE person SET id = 555555 WHERE id = 3000005
UPDATE employee SET person_id = 555555 WHERE person_id = 3000005
ALTER TABLE employee ADD CONSTRAINT fk_employee_person FOREIGN KEY (person_id) REFERENCES person(id)
一些新的信息:它看起來像有時IBExpert讓我去通過這些步驟。實際上,如果我在其中一個表處於「數據」模式(我想,它也是某種交易,如CREATE VIEW
)中更改了所有ID,則會發生錯誤。
我還發現,刪除/添加外鍵,需要整個數據庫至少到上排它鎖火鳥2.1(甚至2.5)
請向我們展示您正在執行的完整SQL語句 –
您是在一個事務中執行步驟2和3還是使用自動提交? –