Как найти таблицы, имеющей внешний ключ к таблице в Oracle?
Я планирую удалить данные из таблицы, я хотел бы знать, сколько и какие таблицы имеют ссылку на внешний ключ для этой конкретной таблицы в Oracle. Поскольку мне придется установить внешние ключи в null. Я хотел бы знать список всех таблиц, которые имеют FK для этой конкретной таблицы.
8 ответов
select d.table_name,
d.constraint_name "Primary Constraint Name",
b.constraint_name "Referenced Constraint Name"
from user_constraints d,
(select c.constraint_name,
c.r_constraint_name,
c.table_name
from user_constraints c
where table_name='EMPLOYEES' --your table name instead of EMPLOYEES
and constraint_type='R') b
where d.constraint_name=b.r_constraint_name
SELECT
FK.OWNER||'.'||FK.TABLE_NAME AS CHILD_TABLE,
SRC.OWNER||'.'||SRC.TABLE_NAME AS PARENT_TABLE,
FK.CONSTRAINT_NAME AS FK_CONSTRAINT,
SRC.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT
FROM ALL_CONSTRAINTS FK
JOIN ALL_CONSTRAINTS SRC ON FK.R_CONSTRAINT_NAME = SRC.CONSTRAINT_NAME
WHERE
FK.CONSTRAINT_TYPE = 'R'
AND SRC.OWNER = 'MY_SCHEMA'
AND SRC.TABLE_NAME = 'MY_TABLE';
у меня есть ситуация, когда таблица, которую я интересую, не принадлежит схеме, к которой я подключался. Поэтому мне нужно было изменить запрос в в настоящее время принимаются ответ использовать ALL_CONSTRAINTS
вместо USER_CONSTRAINTS
. В процессе я допустил ошибку, и я обнаружил, что принятый ответ очень трудно прочитать, чтобы я мог его исправить. (Отсутствие объяснений не помогло.) В результате я в конечном итоге придумал свой собственный запрос. Это в основном то же самое, но я думаю, что это немного легче грокнуть.
FK.CONSTRAINT_TYPE = 'R'
фильтры вниз FK
к набору ограничений внешнего ключа и соединению пары этих внешних ключей с их "ссылочным ограничением". (Ссылочное ограничение обычно является первичным ключом "родительской" таблицы.) Наконец, мы фильтруем вниз к родительской таблице, которую мы заинтересованы в использовании SRC.OWNER = 'MY_SCHEMA' AND SRC.TABLE_NAME = 'MY_TABLE'
.
естественно, вы можете переключить это на использование USER_CONSTRAINTS
Если вы хотите; просто удалить SRC.OWNER
и OWNER
префиксы в SELECT
.
ниже запрос даст все ограничения внешнего ключа, определенные на TABLE_NAME:
select baseTable.* from all_constraints baseTable , all_constraints referentedTable
where baseTable.R_CONSTRAINT_NAME = referentedTable.CONSTRAINT_NAME
and baseTable.constraint_type = 'R'
and referentedTable.table_name = 'TABLE_NAME';
Если Вам также нужны поля для включения:
select b.table_name "Referencing Table",
b.CONSTRAINT_NAME "Referencing Constraint",
(select wm_concat(column_name)
from all_cons_columns
where owner = b.owner
and constraint_name = b.CONSTRAINT_NAME
) "Referencing Columns",
a.CONSTRAINT_NAME "Referenced Constraint",
(select wm_concat(column_name)
from all_cons_columns
where owner = a.owner
and constraint_name = a.CONSTRAINT_NAME
) "Referenced columns"
from all_constraints a,
all_constraints b
where a.owner = b.r_owner
and a.owner = '<<OWNER>>'
and a.table_name = '<<TABLE_NAME>>'
and a.constraint_type in ('P', 'U')
and b.constraint_type = 'R'
and b.R_CONSTRAINT_NAME = a.constraint_name
нет необходимости делать этот шаг вручную - вы можете просто использовать каскадное удаление.
SELECT a.table_name, a.column_name, a.constraint_name, c.owner,
-- referenced pk
c.r_owner, c_pk.table_name r_table_name, c_pk.constraint_name r_pk
FROM all_cons_columns a
JOIN all_constraints c ON a.owner = c.owner
AND a.constraint_name = c.constraint_name
JOIN all_constraints c_pk ON c.r_owner = c_pk.owner
AND c.r_constraint_name = c_pk.constraint_name
WHERE c.constraint_type = 'R'
AND a.table_name = :TableName
возможно, я неправильно понял, что спросил Уокер, но я понял : как найти таблицы, которые имеют ссылку на внешний ключ к определенной таблице (например, сотрудники).
Если я попробую ответ купы:
select d.table_name,
d.constraint_name "Primary Constraint Name",
b.constraint_name "Referenced Constraint Name"
from user_constraints d,
(select c.constraint_name,
c.r_constraint_name,
c.table_name
from user_constraints c
where table_name='EMPLOYEES' --your table name instead of EMPLOYEES
and constraint_type='R') b
where d.constraint_name=b.r_constraint_name
Я получаю таблицы, на которые сотрудники имеют ссылку на внешний ключ.
человек.foreign_key => таблицы.primary_key
см. ниже обновленный sql для получения таблиц, которые имеют ссылку на внешний ключ РАБОТНИКИ.
таблицы.foreign_key => сотрудники.primary_key
select b.table_name "Table Name",
b.constraint_name "Constraint Name",
d.table_name "Referenced Table Name",
d.constraint_name "Referenced Constraint Name"
from user_constraints d,
(select c.constraint_name,
c.r_constraint_name,
c.table_name
from user_constraints c
where constraint_type='R') b
where d.table_name = 'EMPLOYEES' --your table name instead of EMPLOYEES
and b.r_constraint_name = d.constraint_name;
SELECT CONSTRAINT_NAME from ALL_CONSTRAINTS WHERE OWNER= sys_context('userenv','current_schema') AND CONSTRAINT_TYPE='R';