Для данной таблицы "foo" мне нужен запрос для создания набора таблиц с внешними ключами, которые указывают на foo. Я использую Oracle 10G.
Запрос внешних внешних связей таблицы
Ответ 1
Это должно работать (или что-то близкое):
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>');
Ответ 2
Следующее выражение должно дать детям и всем их потомкам. Я тестировал его в базе данных 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
Ответ 3
Здесь, как взять Майка на один шаг дальше, чтобы получить имена столбцов из имен ограничений:
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>'));
Ответ 4
ссылка на Документация Oracle Database Online
Возможно, вам захочется изучить Словарь словаря данных. У них есть префиксы:
- Пользователь
- Все
- DBA
Пример:
select * from dictionary where table_name like 'ALL%'
Продолжая пример Майка, вы можете создать сценарии для включения/отключения ограничений. Я только изменил 'select' в первой строке.
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>');
Ответ 5
Я знаю, что поздно ответить, но позвольте мне ответить в любом случае, некоторые из приведенных выше ответов довольно сложны, поэтому здесь гораздо проще принять.
`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'`
Ответ 6
Загрузите справочное руководство Oracle для 10G, которое объясняет таблицы словарей данных.
Ответы выше хорошо, но проверьте другие таблицы, которые могут относиться к ограничениям.
SELECT * FROM DICT WHERE TABLE_NAME LIKE '%CONS%';
Наконец, получите инструмент, подобный Toad или SQL Developer, который позволяет вам просматривать этот материал в пользовательском интерфейсе, вам нужно научиться использовать эти таблицы, но вы также должны использовать интерфейс.
Ответ 7
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;
Ответ 8
select acc.table_name, acc.constraint_name
from all_cons_columns acc
inner join all_constraints ac
on acc.constraint_name = ac.constraint_name
where ac.r_constraint_name in (
select constraint_name
from all_constraints
where table_name='yourTable'
);