我有一堆表,其中包含Oracle DB中某些主表的外键。 在每个表中,主表中给定的id值有几行。
我的任务是为主表中的给定ID复制所有在其他表中引用该id的记录,但使用新的id值作为对主表的引用。
我已经编写了PL / SQL程序,它遍历每个表,并以最明显和最直接的方式完成所需的操作。但是,我想知道,这个问题更优雅的解决方案是什么?也许为一般案例编写一些通用程序,然后从我的主程序中为每个表调用它,或者可以在这里做更有效的事情?
答案 0 :(得分:2)
“遍布每张桌子”并以“明显而直接的方式”运作的解决方案似乎很可能是最优雅的解决方案,至少对于大量问题而言。
如果您正在尝试构建通用实用程序,则可以执行以下操作:查询数据字典以获取与特定表相关的外键,并遍历树以查找子表,孙表等,并动态构建你想要的逻辑。然而,这将涉及一堆动态SQL,这意味着编写代码需要更长的时间,将来更难以阅读和修改,它可能会更慢,如果你将更加脆弱我们希望为不同的表设置不同的逻辑(例如,如果您希望以不同方式处理历史记录或审计表),或者您希望处理相关但未由外键强制执行的事务。如果您希望具有适用于许多不同基表的类似逻辑,或者您正在构建要与任意数据库一起使用的应用程序,则这些可能是可接受的权衡。如果您只是想在自定义系统中尝试使用一个或两个基表,那么它们可能是不可接受的权衡。
答案 1 :(得分:0)
以下解决方案最接近我的需求,并基于对this question的回答:
begin
FOR r IN (SELECT *
FROM table_name
WHERE fk_id = "old fk value")
LOOP
r.pk_id := pk_seq.NEXTVAL;
r.fk_id := "new fk value";
INSERT INTO table_name
VALUES r ;
END LOOP;
end;