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

msweb msweb @ usen-43x235x183x54.ap-USEN.usen.ad.jp
2002年 10月 26日 (土) 22:29:56 JST


初めて投稿します。いつも読んでばかりのmsahikoと申します。

ある書籍からのデータを元にしてテーブルの外部キーを設定したのですが、どうして
も希望する設定ができません。
分かり難い説明で申し訳ないですが、

uriage_jouhou(商品の売上のテーブル、販売員、商品明細、顧客情報、商品の販売
集計などを参照している)の主キーでpsales_no(売上ナンバー)というカラムがあ
ります。
それと関連してuriage_meisai(商品の販売集計のテーブル、uriage_jouhouから参照
されている)にはsales_no(商品明細ナンバー)、psales_no(売上ナンバー)があ
り、この2つのカラムを組として主キーを構成しています。

uriage_jouhouでキャンセルなどが入って削除すると、deleteでカスケードの設定と
して、uriage_meisaiでは対応するpsales_noのレコードを連鎖的に削除されるように
しました。この場合外部キーを設定するのはuriage_meisaiのpsales_noで主キーは
uriage_jouhouのpsales_noとなります。

実際のところでは、下記のsqlでカスケードの設定は問題ありませんでした。テスト
でも連鎖して削除されます。

create table uriage_meisai(sales_no int4,
 psales_no int4 not null,
 prod_id int4 not null,
 quantity int4,
 price int4,
 allprice int4,
 session varchar(20),
 PRIMARY KEY(sales_no, psales_no),

FOREIGN KEY (prod_id) REFERENCES shouhin(prod_id) -- これは他のテーブルへの
外部キーの設定です。
                                   --参照
しているデータの削除、変更は許しません。

     on delete
          no action

    on update
         no action,

 FOREIGN KEY (psales_no) REFERENCES uriage_jouhou(psales_no)  --これが
uriage_jouhouに対する設定です。

      on delete
          cascade

     on update
          no action

    );

さらにuriage_jouhouからuriage_meisaiの販売リストを参照しているので、
uriage_jouhouのpsales_noは外部キーとなり、uriage_meisaiのpsales_noは主キーと
して設定すると思います。(変な言い方かもしれません、対応する主キーの設定と言
うべきかもしれませんが)
これはuriage_meisaiのレコードでuriage_jouhouから参照されているのを削除される
のを防ぐためですが。

上記でいくとuriage_jouhouのpsales_noカラムは主キーに設定されているので、外部
キーとして二重に設定できるのは・・・非常に無理があるとおもいましたが、やはり
設定できません。テーブルの作成で主キーを設定し、FOREIGN KEY (psales_no)で外
部キーを設定して、uriage_meisaiから参照された時だけ外部キーに成り代わるとは
とても思えないのですが。
それに相手の主キーは2つのカラムが組みになっているので、一つだけを主キーとし
て設定するのは・・・、無理のような。

sqlを組みましたが見ているだけで不合理で、もちろんエラーが出ました。


create table uriage_jouhou(
  psales_no           INT4,
  psales_date         DATE,
  emp_id              INT4,
  cust_id             INT4,
  cust_address        text,
  cust_tel            VARCHAR(20),
  delivery_date       DATE,
  delivery_time       TIME,
  total               INT4,
  carriage            INT4,
  excise              INT4,
  all_total           int4,
  otodoke_meishou     varchar(20),

  PRIMARY KEY ( psales_no ),

FOREIGN KEY(emp_id)
 REFERENCES hanbai_tantou(emp_id)

     on delete
          no action

    on update
          no action,


FOREIGN KEY(cust_id)
 REFERENCES kokyaku(cust_id)


     on delete
          no action

    on update
          no action,

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


     on delete
          no action

    on update
          no action

);

上記の2つの状態を設定することは可能でしょうか?


とんでもない思い違いや、基本的なことを忘れているかもしれませんがよろしくお願
いいたします。




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