在Oracle数据库中的两个表中交换外键

时间:2015-04-07 11:25:28

标签: database oracle foreign-keys

我在Oracle TABLE_A和TABLE_B中有两个表,两个表都有大约20000到30000条记录。

TABLE_B中的记录通过外键链接到TABLE_A中的记录 - (TABLE_B包含TABLE_A的主键)

我需要交换外键。即。

我希望现在TABLE_A应该包含TABLE_B的主键。 (这是一个功能要求 - 由于前端的一些验证,当前形式的数据库实现中的这些表的更新是不可能的。)

此外,在执行此操作时,我希望从(TABLE_B - > TABLE_A)链接的记录仍保持链接。 现在通过新的外键(TABLE_A - > TABLE_B)。

可以通过几个ALTER TABLE命令轻松移动FOREIGN KEY,主要问题是保留数据并正确重新链接。

最明显的方法是将整个表备份,然后创建新脚本以在两个表中重新插入更新的数据。

有没有更快的方法可以做到这一点而不会有任何错误。

1 个答案:

答案 0 :(得分:1)

假设以下结构:

TABLE_A (a_id [pk], ...)
TABLE_B (b_id [pk], a_id, ...)
  unique constraint on TABLE_B (a_id)
  referential constraint TABLE_B (a_id) -> TABLE_A (a_id)

假设您的系统可以处理短暂中断,您可以执行类似的操作:

ALTER TABLE TABLE_A ADD (b_id NUMBER);

MERGE INTO TABLE_A t USING
  (SELECT b_id, a_id FROM TABLE_B) s
ON (t.a_id = s.a_id)
WHEN MATCHED THEN UPDATE
  SET t.b_id = s.b_id;

ALTER TABLE TABLE_A ADD CONSTRAINT a_b_fk
  FOREIGN KEY (b_id) REFERENCES TABLE_B (b_id);

ALTER TABLE TABLE_B DROP COLUMN a_id;

对于只有30K的记录,这应该花很少的时间。

上面缺少的唯一内容是删除TABLE_B上的旧主键约束并在TABLE_A(b_id)上添加新的约束。