Вы можете найти ВОЗМОЖНОЕ отсутствие внешнего ключа, если предположите, что можете определить ВОЗМОЖНУЮ связь между внешними ключами, найдя столбцы с одинаковыми именами и типами данных в разных таблицах, одна из которых является первичным ключом, а другая не имеет ссылкик этому ключу.
Вы можете использовать запрос, подобный следующему:
select c1.TABLE_NAME, c1.COLUMN_NAME, c2.TABLE_NAME, c2.COLUMN_NAME
from user_tab_columns c1,
user_tables at1,
user_tab_columns c2,
user_tables at2
where c1.COLUMN_NAME = c2.COLUMN_NAME
and c1.DATA_TYPE = c2.DATA_TYPE
and c1.TABLE_NAME = at1.TABLE_NAME
and c2.TABLE_NAME = at2.TABLE_NAME
and c1.TABLE_NAME != c2.TABLE_NAME
/*and c1.TABLE_NAME = 'TABLE' --check this for one table
and c1.COLUMN_NAME = 'TABLE_PK'*/
and not exists (select 1
from user_cons_columns ucc,
user_constraints uc,
user_constraints uc2,
user_cons_columns ucc2
where ucc.CONSTRAINT_NAME = uc.CONSTRAINT_NAME
and uc.TABLE_NAME = ucc.TABLE_NAME
and ucc.table_name = c1.TABLE_NAME
and ucc.column_name = c1.COLUMN_NAME
and uc.CONSTRAINT_TYPE = 'P'
and uc2.table_name = c2.TABLE_NAME
and ucc2.column_name = c2.COLUMN_NAME
and uc2.table_name = ucc2.table_name
and uc2.r_constraint_name = uc.constraint_name
and uc2.constraint_type = 'R')
Этот (эскиз, но ни в коем случае не оптимизированный) просматривает все пары равенства типа имени столбца и находит, еслиодин - ПК, а другой не ссылается на него.
Но, и здесь я согласен с Джеффри, это очень человеческий разум, и никакой инструмент точно не сделает этого.В любом случае вам придется делать это вручную.