Как найти таблицы, имеющие внешний ключ к таблице в Oracle? - PullRequest
9 голосов
/ 20 сентября 2010

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

Ответы [ 8 ]

12 голосов
/ 20 сентября 2010
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
10 голосов
/ 03 июня 2014
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.

6 голосов
/ 23 февраля 2016

В приведенном ниже запросе будут указаны все ограничения внешнего ключа, определенные для 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';
1 голос
/ 15 ноября 2015

Если вам также нужно включить поля:

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
0 голосов
/ 26 сентября 2018
SELECT CONSTRAINT_NAME from ALL_CONSTRAINTS WHERE OWNER= sys_context('userenv','current_schema') AND CONSTRAINT_TYPE='R';
0 голосов
/ 27 октября 2017

Может быть, я неправильно понял вопрос Уокера, но я понял следующее: как найти таблицы, имеющие ссылку на внешний ключ для конкретной таблицы (например, EMPLOYEES).

Если я попробую ответ Купы:

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

Я получаю таблицы, на которые у СОТРУДНИКОВ есть ссылка на внешний ключ.

EMPLOYEES.foreign_key => TABLES.primary_key


См. Ниже обновленный sql для получения таблиц, имеющих ссылку на внешний ключ для СОТРУДНИКОВ.

TABLES.foreign_key => EMPLOYEES.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;
0 голосов
/ 03 октября 2015
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
0 голосов
/ 25 сентября 2010

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

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