Запросить отношения внешнего ключа таблицы - PullRequest
22 голосов
/ 17 сентября 2008

Для данной таблицы 'foo' мне нужен запрос для генерации набора таблиц с внешними ключами, указывающими на foo. Я использую Oracle 10G.

Ответы [ 7 ]

41 голосов
/ 17 сентября 2008

Это должно работать (или что-то близкое):

select table_name
from all_constraints
where constraint_type='R'
and r_constraint_name in 
  (select constraint_name
  from all_constraints
  where constraint_type in ('P','U')
  and table_name='<your table here>'); 
4 голосов
/ 18 сентября 2008

Следующее утверждение должно дать детям и всем их потомкам. Я проверил это на базе данных Oracle 10.

SELECT  level, main.table_name  parent,
    link.table_name child
FROM    user_constraints main, user_constraints link    
WHERE   main.constraint_type    IN ('P', 'U')
AND link.r_constraint_name  = main.constraint_name
START WITH main.table_name  LIKE UPPER('&&table_name')
CONNECT BY main.table_name = PRIOR link.table_name
ORDER BY level, main.table_name, link.table_name
2 голосов
/ 28 мая 2014

Вот как можно сделать запрос Майка на один шаг дальше, чтобы получить имена столбцов из имен ограничений:

select * from user_cons_columns
where constraint_name in (
  select constraint_name 
  from all_constraints
  where constraint_type='R'
  and r_constraint_name in 
    (select constraint_name
    from all_constraints
    where constraint_type in ('P','U')
    and table_name='<your table name here>'));
1 голос
/ 21 января 2016

Я знаю, что уже довольно поздно отвечать, но позвольте мне ответить в любом случае, некоторые из приведенных выше ответов довольно сложны, поэтому здесь гораздо проще.

       `SELECT a.table_name child_table, a.column_name child_column, a.constraint_name, 
       b.table_name parent_table, b.column_name parent_column
       FROM all_cons_columns a
       JOIN all_constraints c ON a.owner = c.owner AND a.constraint_name = c.constraint_name
       join all_cons_columns b on c.owner = b.owner and c.r_constraint_name = b.constraint_name
       WHERE c.constraint_type = 'R'
       AND a.table_name = 'your table name'`
1 голос
/ 17 сентября 2008

ссылка на Документация по базе данных Oracle Online

Возможно, вы захотите изучить Представления словаря данных . У них есть префиксы:

  • Пользователь
  • Все
  • DBA

образец:

select * from dictionary where table_name like 'ALL%' 

Продолжая пример Майка, вы можете захотеть сгенерировать сценарии для включения / отключения ограничений. Я только изменил «выбрать» в первом ряду.

select  'alter table ' || TABLE_NAME || ' disable constraint ' || CONSTRAINT_NAME || ';'
from all_constraints
where constraint_type='R'
and r_constraint_name in 
  (select constraint_name
  from all_constraints
  where constraint_type in ('P','U')
  and table_name='<your table here>');
0 голосов
/ 01 декабря 2014
select distinct table_name, constraint_name, column_name, r_table_name, position, constraint_type 
from (
    SELECT uc.table_name, 
    uc.constraint_name, 
    cols.column_name, 
    (select table_name from user_constraints where constraint_name = uc.r_constraint_name) 
        r_table_name,
    (select column_name from user_cons_columns where constraint_name = uc.r_constraint_name and position = cols.position) 
        r_column_name,
    cols.position,
    uc.constraint_type
    FROM user_constraints uc
    inner join user_cons_columns cols on uc.constraint_name = cols.constraint_name 
    where constraint_type != 'C'
) 
start with table_name = '&&tableName' and column_name = '&&columnName'  
connect by nocycle 
prior table_name = r_table_name 
and prior column_name = r_column_name;   
0 голосов
/ 17 сентября 2008

Загрузите справочное руководство Oracle для 10G, в котором приведены таблицы словаря данных.

Ответы выше хороши, но посмотрите другие таблицы, которые могут относиться к ограничениям.

SELECT * FROM DICT WHERE TABLE_NAME LIKE '%CONS%';

Наконец, получите инструмент, такой как Toad или SQL Developer, который позволяет вам просматривать этот материал в пользовательском интерфейсе, вам нужно научиться использовать таблицы, но вы также должны использовать пользовательский интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...