我有一个oracle数据库模式与更复杂的外键关系..我需要将测试数据填充到所有表..由于外键约束我发现很难找到表的层次结构..任何人都可以建议任何包或方法来完成这个..
提前致谢
答案 0 :(得分:6)
如果您能告诉我们您想要输出的格式,将会很有帮助。您可能想从Frank Kulash的example of a hierarchial query against the DBA_CONSTRAINTS
table开始展示路径。
如果您正在寻找一种方法来确定加载表的顺序,那与question that was asked on dba.stackexchange相同(不能将此问题标记为重复,因为DBA仍处于测试阶段)。像
这样的东西WITH constraint_tree AS
(
SELECT DISTINCT
a.table_name AS table_name
, b.table_name AS parent_table_name
FROM dba_constraints a
LEFT OUTER JOIN dba_constraints b
ON a.r_constraint_name = b.constraint_name
AND a.owner = b.owner
WHERE a.owner = 'SCOTT'
)
SELECT table_name, lvl
FROM (
SELECT a.*,
rank() over (partition by table_name order by lvl desc) rnk
FROM (
SELECT table_name, level lvl
FROM constraint_tree
START WITH parent_table_name IS NULL
CONNECT BY NOCYCLE parent_table_name = PRIOR table_name
) a
) b
WHERE rnk = 1
ORDER BY lvl, table_name
/
将按照应加载的顺序为您提供表格(假设数据中没有循环)。如果要并行加载,则可以同时加载具有相同LVL
的所有表。
答案 1 :(得分:2)
如果表的层次结构非常复杂,并且您可以单独访问模式(即对用户施加一些“停机时间”),则可以禁用所有外键约束,加载数据,然后重新 - 启用约束。
另一种选择是使用可延迟约束,并且只将它们推迟到正在加载数据的会话中;但是有一些缺点,一个是你首先必须放弃所有约束,以便在它们尚未推出时使它们可以延迟。