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

Swap the foreign key in two tables in Oracle database

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

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

我需要交换外键。即

我希望现在 TABLE_A 应该包含 TABLE_B 的主键。 (这是一项功能要求 - 由于前端的某些验证,无法以当前的数据库实现形式更新这些 table。)

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

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

最明显的方法是对整个 table 进行备份,然后创建新脚本以将更新后的数据重新插入 table。

有没有更快的方法来做到这一点而不会出错。

假设结构如下:

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).

上添加新主键约束