gpt4 book ai didi

java - 外键引用目标不存在

转载 作者:行者123 更新时间:2023-11-29 03:40:01 25 4
gpt4 key购买 nike

我需要同步来自不同 Firebird 数据库的两个表中的数据。准确地说,我需要使用表用户(第二个数据库)中的记录更新表 Person(第一个数据库)中的记录。不仅是“姓名”、“电子邮件”、“生日”,还有 ID(!)。问题是 - 有些表通过外键约束依赖于人员的 ID。

我正在尝试这样做:

  1. 删除从属表中的外键约束。
  2. 同步两个表(这意味着更新/更改表 Person 中的 ID)
  3. 更改相关表中的适当 ID。
  4. 在相关表中添加外键约束。

最后一步导致错误(来自 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。我使用 Firebird 2.5.1。

完整的 SQL 语句(示例):

  1. ALTER TABLE employee DROP CONSTRAINT fk_employee_person
  2. UPDATE person SET id = 555555 WHERE id = 3000005
  3. UPDATE employee SET person_id = 555555 WHERE person_id = 3000005
  4. 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)之前,删除/添加外键需要对整个数据库进行独占锁定

最佳答案

您应该创建您的表,以便外键确实具有 ON UPDATE CASCADE 子句 - 然后当您更新 ID 时,它也会在从属表中更新,而无需您的任何额外努力。因此,对于每个引用 Person 表的表,您需要执行以下操作:

-- delete the original FK constraint
ALTER TABLE _table_ DROP CONSTRAINT _fk_constraint_name_;
-- (re)add the FK constraint with ON UPDATE CASCADE
ALTER TABLE _table_ ADD CONSTRAINT _fk_constraint_name_ FOREIGN KEY (person_id) REFERENCES person(id) ON UPDATE CASCADE;

关于java - 外键引用目标不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13629087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com