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