web-dev-qa-db-ja.com

テーブルの外部キー関係をクエリする

与えられたテーブル 'foo'に対して、fooを指す外部キーを持つテーブルのセットを生成するクエリが必要です。 Oracle 10Gを使用しています。

23
Mark Roddy

これはうまくいくはずです(または近いもの):

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>'); 
42
Mike Monette

次のステートメントは、子供とそのすべての子孫を与える必要があります。 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
4
richard.j.lewis

Mikeのクエリをさらに一歩進めて、制約名から列名を取得する方法は次のとおりです。

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

リンク Oracleデータベースオンラインドキュメント

データディクショナリビュー を探索することもできます。プレフィックスがあります:

  • ユーザー
  • すべて
  • DBA

サンプル:

select * from dictionary where table_name like 'ALL%' 

Mikeの例を続けると、制約を有効/無効にするスクリプトを生成することができます。最初の行の「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>');
1
Tony R

少し遅いのはわかっていますが、とにかく答えましょう。上記の回答の一部は非常に複雑なので、ここでははるかに簡単な方法を示します。

 `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 
 all_cons_columns b on c.owner = b.ownerおよびc.r_constraint_name = b.constraint_name 
 WHERE c.constraint_type = 'R' 
 AND a.table_name = 'あなたのテーブル名' `
1
arvinq

1つのテーブルのすべての制約

select 

    uc.OWNER,
    uc.constraint_name as TableConstraint1,
    uc.r_constraint_name as TableConstraint2,
    uc.constraint_type as constrainttype1,
    us.constraint_type as constrainttype2,
    uc.table_name as Table1,us.table_name as Table2,
    ucc.column_name as TableColumn1, 
    uccs.column_name as TableColumn2
from user_constraints uc
    left outer join user_constraints us on uc.r_constraint_name = us.constraint_name
    left outer join USER_CONS_COLUMNS ucc on ucc.constraint_name = uc.constraint_name
    left outer join USER_CONS_COLUMNS uccs on uccs.constraint_name = us.constraint_name
where uc.OWNER ='xxxx' and uc.table_name='xxxx' 
0
Mehmet Kurt
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'
    );
0
Hiram

データディクショナリテーブルについて説明している10GのOracleリファレンスガイドをダウンロードしてください。

上記の回答は適切ですが、制約に関連する可能性のある他の表を確認してください。

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

最後に、ToadやSQL Developerのようなツールを入手して、UIでこの項目を参照できるようにします。テーブルの使用方法を学ぶ必要がありますが、UIも使用する必要があります。

0
Ethan Post
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;   
0
Abu Turab