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

msweb msweb @ usen-43x235x183x54.ap-USEN.usen.ad.jp
2002年 10月 27日 (日) 12:46:22 JST


ご返信有難うございます、masahikoです。

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

はい、その通りです。すいません、・・・、実際に仕事で触っているデータは社外秘
で使えないもので。
自分が分かりやすいように勝手に変更してしまいました。mysqlでは使えなかった
色々なものを勉強中で頭が混乱してまして・・・。

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

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

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

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

はい、私もそう理解しているのですが。

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

いえ、私の説明が雑で申し訳ないのですが、逆でuriage_jouhouが削除されたら、参照
されているuriage_meisaiも削除、なのですが。

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

>で、どうしてもということであれば、やはりお書きになられている
>ように、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;

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

売上に関する情報が集約されているuriage_jouhouと、販売された商品のリストの
uriage_meisaiとを参照性整合性を設定するとなると一番一般的にはどうなるか、と
考えたのですが。

1.もし顧客からキャンセルが入ったら(キャンセルの情報は無視するとして)
uriage_jouhouのレコードが削除されて、さらに参照していたuriage_meisaiのレコー
ドも合わせて削除。
2.uriage_meisaiのレコードを削除しようとするとuriage_jouhouから参照されている
ので処理を行われないようにする。

1.は成り立っても2.はできないような気がします。(外部キーの設定の範囲のみです
が)
設定するにはどんな方法が考えられるでしょうか。今後の宿題としたいと思うのです
が。

今年の初めから羽生様の書籍で今まで仕事の合間にPOSTGRESQLを勉強中です。
他の書籍でまとまったテーブルの資料がなかったので使わせていただいています。






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