我需要同步来自不同 Firebird 数据库的两个表中的数据。准确地说,我需要使用表用户(第二个数据库)中的记录来更新表人(第一个数据库)中的记录。不仅是“姓名”、“电子邮件”、“生日”,还有 ID(!)。问题是 - 有些表通过外键约束依赖于人员的 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"
(Employee - 是从属表之一)
我的问题是,我是否可以避免这个错误。或者也许有一些关于如何更改相关表中的 ID 的想法。同步数据库可能有特殊的 RDBMS 工具,但我需要通过 Java 应用程序同步它们,因此只使用 sql 和 java。我使用火鸟 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 允许我完成这些步骤。实际上,如果我在其中一个表处于“DATA”模式时更改了所有 ID,它会给出错误(我想,它也是某种事务,例如CREATE VIEW
)。
我还发现删除/添加外键至少在 Firebird 2.1(甚至 2.5)之前需要对整个数据库进行独占锁定