交换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).
上添加新主键约束
我在 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).
上添加新主键约束