Отображение отношений внешних ключей в Oracle 9i - PullRequest
3 голосов
/ 10 декабря 2008

Есть ли в Oracle 9i команда, которая отображает внешние ключи таблицы, а также таблицу, на которую ссылаются эти внешние ключи?

Я искал, ничего не нашел, но я нашел эквивалентную команду, которая работает с MySql, SHOW CREATE TABLE

Есть ли эквивалентная команда для этого в SQL оракула?

Я ценю ваш ответ, однако я думал, что есть очень короткий способ сделать это, как MySql.

Ответы [ 4 ]

4 голосов
/ 10 декабря 2008

Вот еще один ответ: в пакете dbms_metadata есть функция, которая может возвращать DDL для определения таблицы.

SELECT dbms_metadata.get_ddl('TABLE', '<table>', '<schema>') FROM dual;

Этот пакет, очевидно, доступен с Oracle 9.2

http://download -west.oracle.com / Docs / кд / B10501_01 / appdev.920 / a96612 / d_metada.htm # 1656

2 голосов
/ 10 декабря 2008

Можно начать с перечисления всех ограничений для таблицы вместе с любым ссылочным ограничением для других таблиц:

SELECT
     acc.table_name
    ,acc.column_name
    ,acc.constraint_name
    ,ac.r_constraint_name AS referenced_constraint
FROM all_cons_columns acc
INNER JOIN all_constraints ac ON (acc.constraint_name = ac.constraint_name)
WHERE acc.table_name = UPPER('your_table_here');

Если у вас есть разумные соглашения об именах для ваших ограничений, должна быть возможность определить, какие внешние ключи являются типичными для префикса / суффикса 'FK'.

1 голос
/ 10 декабря 2008

Это может делать то, что вы хотите, он использует системные представления Oracle. Однако у меня нет экземпляра Oracle для его тестирования.

SELECT fk.owner, fk.constraint_name, fk.table_name, fc.column_name,
  pk.owner, pk.constraint_name, pk.table_name, pc.column_name
FROM all_constraints fk
 JOIN all_cons_columns fc ON (fk.owner = fc.owner AND fk.constraint_name = fc.constraint_name)
 JOIN (all_constraints pk
   JOIN all_cons_columns pc ON (pk.owner = pc.owner AND pk.constraint_name = pc.constraint_name)) 
 ON (fk.r_owner = pk.owner AND fk.r_constraint_name = pk.constraint_name
   AND fc.position = pc.position)
WHERE fk.constraint_type = 'R' AND pk.constraint_type IN ('P', 'U')
  AND fk.owner = '<schema>' AND fk.table_name = '<table>';
0 голосов
/ 09 января 2010

Если вам понадобится DDL для внешних ключей в будущем, то здесь ответ заранее:)

select 
  DBMS_METADATA.GET_DEPENDENT_DDL('REF_CONSTRAINT' ,atb.table_name, atb.owner) 
from 
  all_tables atb, all_constraints ac
where 
  atb.owner = ac.owner and
  ac.constraint_type = 'R' and
  ac.table_name = atb.table_name and
  atb.owner = 'YOURSCHEMA';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...