我有一个非常大的Oracle数据库,有许多许多表和数百万行。我需要删除其中的一个,但要确保删除它不会破坏指向它作为外键记录的任何其他依赖行。有没有办法获得指向此行的所有其他记录的列表,或者至少是表模式?我知道我可以尝试自己删除它,并捕获异常,但我不会自己运行脚本,需要它第一次运行干净。
我有来自Oracle的工具SQL Developer和来自AllRoundAutomations的PL/SQL Developer可供我使用。
提前感谢!
发布于 2010-03-25 01:01:58
我总是查看开始表的外键,然后返回。DB工具通常有一个依赖或约束节点。我知道PL/SQL Developer有办法查看FK,但我已经有一段时间没有使用它了,所以我无法解释它……
只需将XXXXXXXXXXXX替换为表名...
/* The following query lists all relationships */
select
a.owner||'.'||a.table_name "Referenced Table"
,b.owner||'.'||b.table_name "Referenced by"
,b.constraint_name "Foreign Key"
from all_constraints a, all_constraints b
where
b.constraint_type = 'R'
and a.constraint_name = b.r_constraint_name
and b.table_name='XXXXXXXXXXXX' -- Table name
order by a.owner||'.'||a.table_name
发布于 2012-10-02 17:14:40
下面是我的解决方案,列出一个表的所有引用:
select
src_cc.owner as src_owner,
src_cc.table_name as src_table,
src_cc.column_name as src_column,
dest_cc.owner as dest_owner,
dest_cc.table_name as dest_table,
dest_cc.column_name as dest_column,
c.constraint_name
from
all_constraints c
inner join all_cons_columns dest_cc on
c.r_constraint_name = dest_cc.constraint_name
and c.r_owner = dest_cc.owner
inner join all_cons_columns src_cc on
c.constraint_name = src_cc.constraint_name
and c.owner = src_cc.owner
where
c.constraint_type = 'R'
and dest_cc.owner = 'MY_TARGET_SCHEMA'
and dest_cc.table_name = 'MY_TARGET_TABLE'
--and dest_cc.column_name = 'MY_OPTIONNAL_TARGET_COLUMN'
;
使用这个解决方案,您还可以了解哪个表的哪一列正在引用您的目标表的哪一列(并且您可以对其进行过滤)。
发布于 2014-02-14 03:35:05
我最近遇到了一个类似的问题,但很快就体验到了,找到直接依赖项是不够的。因此,我编写了一个查询来显示多级外键依赖关系树:
SELECT LPAD(' ',4*(LEVEL-1)) || table1 || ' <-- ' || table2 tables, table2_fkey
FROM
(SELECT a.table_name table1, b.table_name table2, b.constraint_name table2_fkey
FROM user_constraints a, user_constraints b
WHERE a.constraint_type IN('P', 'U')
AND b.constraint_type = 'R'
AND a.constraint_name = b.r_constraint_name
AND a.table_name != b.table_name
AND b.table_name <> 'MYTABLE')
CONNECT BY PRIOR table2 = table1 AND LEVEL <= 5
START WITH table1 = 'MYTABLE';
当在我的数据库中使用using作为MYTABLE时,它会给出这样的结果:
SHIPMENT <-- ADDRESS
SHIPMENT <-- PACKING_LIST
PACKING_LIST <-- PACKING_LIST_DETAILS
PACKING_LIST <-- PACKING_UNIT
PACKING_UNIT <-- PACKING_LIST_ITEM
PACKING_LIST <-- PO_PACKING_LIST
...
https://stackoverflow.com/questions/2509512
复制相似问题