[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 メーリングリストの案内