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