[pgsql-jp: 27379] Re: 外部キーの設定確認方法
Wataru Kojima
kojima @ ase.co.jp
2002年 9月 11日 (水) 14:06:17 JST
児島と申します。
On Wed, 11 Sep 2002 11:46:54 +0900
吉塚 陽子 <yoshizuka.wakaba @ nikon.co.jp> wrote:
> 吉塚と申します。PostgreSQL7.1.3にて開発しています。
> システムカタログにて、外部キーの設定状況を知ることはできるでしょうか?
>
> たとえば、以下の2つの表が親子関係にあったとします。
>
> 親:scott表
> crate table scott
> (
> id int4 not null,
> name text,
> );
>
> 子:sample表
> create table sample
> (
> id int4 not null,
> name text
> u_id int4 not null,
> foreign key (u_id) references scott(id)
> );
scott.id に対して外部参照とするには
scott.id に UNIQUE か PRIMARY KEY を指定する必要があると思います。
上記のまま create table sample を実行すると、以下のエラーが出ます。
ERROR: UNIQUE constraint matching given keys for referenced table "scott" not found
> sample表のどの列が、どの親表のどの列を外部参照しているか知りたいのです。
> pg_class, pg_attribute, pg_type, pg_inheritsあたりをどうにかすればよいのでし
> ょうが、
> いまいちよく判りません。
> 簡単にできるものであれば、教えていただきたいのですが。
sample テーブルを create したときに
NOTICE: CREATE TABLE will create implicit trigger(s) for FOREIGN KEY check(s)
というメッセージが出ますので、pg_trigger と pg_class を参照すると
SELECT tgargs FROM pg_trigger WHERE tgrelid =
(SELECT relfilenode FROM pg_class WHERE relname = 'sample');
tgargs
---------------------------------------------------------------
<unnamed>\000sample\000scott\000UNSPECIFIED\000u_id\000id\000
(1 row)
といった結果が得られます。
なお、pg_trigger.tgargs は、
"トリガーに渡されるそれぞれ NULL で終結した引数文字列"
とマニュアルに記載されています。
この引数文字列をパースすることで、
外部参照の情報を得ることができそうです。
#もっといい方法がありそう。。。
--
Wataru Kojima <kojima @ ase.co.jp>
pgsql-jp メーリングリストの案内