我需要根据密钥从多个表格和架构中导入一些给定输入的数据。
For-Ex:我有ACCOUNT_ID COLUMN,这是多个表共有的(表与FK相互依赖)。我想从多个模式的所有表中导入特定帐户的数据,并生成SQL脚本。
但挑战是,我需要首先识别父表,然后再按顺序识别他们的子表(与FK并列),这样当我运行脚本时,它不应该错误输出完整性违规错误。
一种方法是禁用所有约束,生成脚本,运行然后启用约束。
但我试图找出是否有更好的方法来做到这一点。启用/禁用约束可能不适合我。
感谢对此问题的任何意见。
答案 0 :(得分:0)
您说您的表基于外键创建层次结构,因此例如T1引用T2,T2引用T3等。
在这种情况下,您需要分层查询。
首先创建一个显示表之间引用的视图:
select c.table_name, uc.table_name as referenced_table_name
from user_constraints c
join USER_CONS_columns uc ON c.r_constraint_name = uc.constraint_name
where c.constraint_type = 'R'
例如在这种情况下:
CREATE TABLE ttt1(
ACCOUNT_ID int primary key,
somecolumn varchar2(100)
);
CREATE TABLE ttt21(
id int primary key,
ACCOUNT_ID int referencing ttt1( ACCOUNT_ID ),
somecolumn varchar2(100)
);
CREATE TABLE ttt22(
id int primary key,
ACCOUNT_ID int referencing ttt1( ACCOUNT_ID ),
somecolumn varchar2(100)
);
CREATE TABLE ttt211(
id int primary key,
ACCOUNT_ID int referencing ttt21( id ),
somecolumn varchar2(100)
);
CREATE TABLE ttt2111(
id int primary key,
ACCOUNT_ID int referencing ttt211( id ),
somecolumn varchar2(100)
);
CREATE TABLE ttt2112(
id int primary key,
ACCOUNT_ID int referencing ttt211( id ),
somecolumn varchar2(100)
);
视图给出:
TABLE_NAME REFERENCED_TABLE_NAME
---------- -------------------------
TTT22 TTT1
TTT211 TTT21
TTT21 TTT1
TTT2111 TTT211
TTT2112 TTT211
现在,借助此视图,您可以创建分层查询:
WITH my_view AS(
select c.table_name, uc.table_name as referenced_table_name
from user_constraints c
join USER_CONS_columns uc ON c.r_constraint_name = uc.constraint_name
where c.constraint_type = 'R'
) SELECT level, m.referenced_table_name
FROM my_view m
START WITH referenced_table_name not in (select table_name from my_view )
CONNECT BY prior table_name = referenced_table_name;
给出以下输出:
LEVEL REFERENCED_TABLE_NAME
---------- -------------------------
1 TTT1
2 TTT21
3 TTT211
3 TTT211
1 TTT1
LEVEL
列给出了必须导入表的顺序 - 首先需要处理级别1的所有表,然后处理级别2,依此类推等等。