[pgsql-jp: 27762] Re: 外部キーの設定に関しまして

羽生 章洋 habu @ air-beat.com
2002年 10月 26日 (土) 23:33:32 JST


"msweb" <msweb @ usen-43x235x183x54.ap-USEN.usen.ad.jp>さん:

はじめまして、羽生と申します。

> ある書籍からのデータを元にしてテーブルの外部キーを設定したのですが、
どうして
> も希望する設定ができません。

項目名から推測するに恐らく私の書籍のように感じますが(^^;;
テーブル名だけ変更されているんですよね。以下そのつもりでレスします。

uriage_jouhouから、uriage_meisaiへの外部キー設定をERDを参考にして
つけたいということであれば、かかれているようにuriage_meisaiに
FOREIGN KEYの記述をするだけでOKです。

逆向きの外部キー設定は通常は不要です。ですから、

> FOREIGN KEY(psales_no)    -- 自分の主キーを外部キーにできないはず
>  REFERENCES uriage_meisai(psales_no)    -- 相手の主キーは2つのカラ
ムの組なの
> に一つして指定できない

という設定は通常は行いません。参照される側(親)に対しては、
何も行いません。あくまでも参照する側(子)に対してのみです。

で、やりたいことが良くわからないのですが、ひょっとして
子供であるuriage_meisaiのレコードが削除されたら、
親であるuriage_jouhouの対応するレコードも削除したいということ
でしょうか?

それであれば、トリガを使うことになるかと思いますが、他に子供が
あったらどうするのか、ということも考えなければならないので、
面倒ではないかと思います。

で、どうしてもということであれば、やはりお書きになられている
ように、2つの列を外部キーとして設定することになります。
判りやすくするためにALTER TABLEで制約を後付けしています。

# 煩雑になるので、他の項目は省略してます。

CREATE TABLE uriage_jouhou (
       psales_no            INT4 NOT NULL,
       sales_no             INT4,
       PRIMARY KEY (psales_no)
);


CREATE TABLE uriage_meisai (
       sales_no             INT4 NOT NULL,
       psales_no            INT4,
       PRIMARY KEY (sales_no, psales_no)
);


ALTER TABLE uriage_jouhou
       ADD FOREIGN KEY (sales_no,psales_no)
                             REFERENCES uriage_meisai
                             ON DELETE SET NULL;


ALTER TABLE uriage_meisai
       ADD FOREIGN KEY (psales_no)
                             REFERENCES uriage_jouhou
                             ON DELETE SET NULL;

ただ、これが必要となるケースというのが全然想像できないので、
(というか、どうやってレコードを入れるんだろうか^^;)
よろしければ、やりたいことをお教えいただけますでしょうか。
そうすれば別の方法を提示できるかと思います。


================================================================
★ワクワク音楽体験サイト それが【エア・ビート・ドットコム】!★
================================================================
有限会社エア・ビート(http://www.air-beat.com/)
取締役兼CEO 羽生 章洋(mailto:habu @ air-beat.com)
================================================================



pgsql-jp メーリングリストの案内