Вопрос

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

Это было полезно?

Решение

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

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>'); 

Другие советы

Следующее заявление следует дать детям и всем их потомкам.Я протестировал это на базе данных 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

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

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>'));

ссылка на Онлайновая документация базы данных Oracle Database

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

  • Пользователь
  • Все
  • ДБА

образец:

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>');

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

       `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'`
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;   

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top