Oracle データベースで SQL を使ってテーブルの外部キーを確認する方法
Oracle データベースのコマンドライン (SQL*Plus 等)で、あるテーブルの外部キー(どのテーブルとどのテーブルが関連しているか)を確認しようとしても DESCRIBE (DESC) コマンドでは表示されません。SQL Developer ツール等を使えば外部キーは簡単に確認することが出来ますが、SQL を使って外部キーを確認したい場合も多々あると思います。そのような場合には、以下の SQL を使うことで様々なテーブルの外部キーを一覧表示することが出来ます。ここでは SYS や SYSTEM 等のシステム関連テーブルは除外しています。
SELECT FOREIGN_TABLE.OWNER AS TABLE_SCHEMA_NAME, FOREIGN_TABLE.TABLE_NAME, FOREIGN_TABLE.COLUMN_NAME, CONSTR.CONSTRAINT_NAME, BASE_TABLE.OWNER AS BASE_TABLE_SCHEMA_NAME, BASE_TABLE.TABLE_NAME AS BASE_TABLE_NAME, BASE_TABLE.COLUMN_NAME AS BASE_TABLE_COLUMN, FOREIGN_TABLE.TABLE_NAME || '.' || FOREIGN_TABLE.COLUMN_NAME || ' = ' || BASE_TABLE.TABLE_NAME || '.' || BASE_TABLE.COLUMN_NAME AS JOIN_CONDITION FROM ALL_CONSTRAINTS CONSTR JOIN ALL_CONS_COLUMNS FOREIGN_TABLE ON (FOREIGN_TABLE.OWNER = CONSTR.OWNER AND FOREIGN_TABLE.CONSTRAINT_NAME = CONSTR.CONSTRAINT_NAME) JOIN ALL_CONS_COLUMNS BASE_TABLE ON (BASE_TABLE.CONSTRAINT_NAME = CONSTR.R_CONSTRAINT_NAME AND BASE_TABLE.OWNER = CONSTR.R_OWNER AND BASE_TABLE.POSITION = FOREIGN_TABLE.POSITION) WHERE CONSTR.R_OWNER NOT IN ('SYS', 'SYSTEM', 'OLAPSYS', 'DBSNMP', 'EXFSYS', 'MDSYS', 'CTXSYS', 'SYSMAN') AND LOWER(FOREIGN_TABLE.TABLE_NAME) LIKE '%' ORDER BY FOREIGN_TABLE.TABLE_NAME, FOREIGN_TABLE.COLUMN_NAME ;
この SQL を実行すると次のような結果が得られます。参考例として結果表示のために SYS スキーマのデータを表示しています。
それぞれの列の意味は次の通りです。
TABLE_SCHEMA_NAME : 参照元のテーブルのスキーマ名 TABLE_NAME : 参照元のテーブル名 COLUMN_NAME : 参照元のテーブルの列名 CONSTRAINT_NAME : 制約名 BASE_TABLE_SCHEMA_NAME : 参照されるテーブルのスキーマ名 BASE_TABLE_NAME : 参照されるテーブル名 BASE_TABLE_COLUMN : 参照されるテーブルの列名 JOIN_CONDITION : テーブル結合条件
この SQL を使うことで各テーブルの外部キー一覧を一度に確認することが出来、各テーブルの関連を簡単に確認することが出来ます。