同时更新父子 Table
Update Parent and Child Table Simultaneously
我需要更新由 primary/foreign 键连接的两个 table 中的一列。我的问题是,当我尝试单独更新任一 table 时,我得到以下任一结果(取决于我尝试更新的 table):
ORA-02292: 违反完整性约束 (URMS.EMSR_EMS_FK) - 找到子记录
或
ORA-02291: 违反完整性约束 (URMS.EMSR_EMS_FK) - 未找到父键
有没有办法用新值同时更新两个 table?我找到的一个解决方案是复制现有行并将它们作为新行插入,然后可以更新这些行——然后可以删除旧行。
这是唯一的解决方案还是有更简单的解决方法?
您有几个解决方法。
- 将约束更改为可延迟约束并延迟它。这会导致在提交时而不是更新时检查密钥。
- 先更新外键为NULL,再更新主键,再更新外键。这假设没有
NOT NULL
约束
- 如果情况变得更糟,请创建一个记录(假设给它一个保留 ID 0,以便您可以检测并避免冲突),将外键更新为该记录,然后更新主键,然后更新外键键,然后删除记录。
但是,无法在 Oracle 中创建同时更新两者的语句,就像您在某些其他数据库中使用 ON UPDATE CASCADE
时那样。
我需要更新由 primary/foreign 键连接的两个 table 中的一列。我的问题是,当我尝试单独更新任一 table 时,我得到以下任一结果(取决于我尝试更新的 table):
ORA-02292: 违反完整性约束 (URMS.EMSR_EMS_FK) - 找到子记录
或
ORA-02291: 违反完整性约束 (URMS.EMSR_EMS_FK) - 未找到父键
有没有办法用新值同时更新两个 table?我找到的一个解决方案是复制现有行并将它们作为新行插入,然后可以更新这些行——然后可以删除旧行。
这是唯一的解决方案还是有更简单的解决方法?
您有几个解决方法。
- 将约束更改为可延迟约束并延迟它。这会导致在提交时而不是更新时检查密钥。
- 先更新外键为NULL,再更新主键,再更新外键。这假设没有
NOT NULL
约束 - 如果情况变得更糟,请创建一个记录(假设给它一个保留 ID 0,以便您可以检测并避免冲突),将外键更新为该记录,然后更新主键,然后更新外键键,然后删除记录。
但是,无法在 Oracle 中创建同时更新两者的语句,就像您在某些其他数据库中使用 ON UPDATE CASCADE
时那样。