gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:45:20 24 4
gpt4 key购买 nike

我在 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,主要问题是保留数据并正确重新链接。

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

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

最佳答案

假设结构如下:

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) 上添加新主键约束。

关于database - 交换Oracle数据库中两个表的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29490451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com