我在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,主要问题是保留数据并正确重新链接。
最明显的方法是将整个表备份,然后创建新脚本以在两个表中重新插入更新的数据。
有没有更快的方法可以做到这一点而不会有任何错误。
答案 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)上添加新的约束。