[pgsql-jp: 32565] Re: 外部キーについて

Tatsuo Ishii t-ishii @ sra.co.jp
2004年 3月 24日 (水) 23:46:32 JST


石井です.

> 今回の仕様が、親テーブルのUNIQUE制約としてMENU_ID、TITLE_ID、CHARA_DATAを
> 1つとして考えております。
> よって各々にUNIQUE制約を持たせることが今回の仕様上できません。
> PRIMARY(MENU_ID、TITLE_ID、CHARA_DATA)または
> UNIQUE INDEX(MENU_ID、TITLE_ID、CHARA_DATA)で宣言した場合は、
> 子から外部キーをつけることが出来ないということでしょうか。

本当に被参照テーブルWHATS_NEW_CHARAの(MENU_ID,TITLE_ID,CHARA_DATA)がユ
ニーク(かつ個々の列だけではユニークにならない)で,かつ参照テーブルから
その一部の列を外部キーとして参照しなければならないとしたら,テーブル設
計がおかしいのではないでしょうか?もしくは,そもそも不要な外部キーをは
ろうとしているのかのどちらかのような気がします.

データの意味もテーブル設計の前提条件も分からないので単なる推測ですが,
たとえば他に

CREATE TABLE menus (
       menu_id smallint primary key,
       menu_name text
);

のようなマスターテーブルがあり,実は

CREATE TABLE WHATS_NEW (
        UP_DATE DATE NOT NULL,          -- 日付
        MENU_ID SMALLINT NOT NULL,      -- メニューID
        TITLE_ID SMALLINT NOT NULL,     -- タイトルID
        CHARA_DATA CHAR(32) NOT NULL,   -- キャラデータ名
        REFIX_DATE DATE NOT NULL,       -- 更新日
        FOREIGN KEY(MENU_ID)    REFERENCES menus(menu_id),
);

だけで十分とか,はたまた

CREATE TABLE WHATS_NEW (
        UP_DATE DATE NOT NULL,          -- 日付
        MENU_ID SMALLINT NOT NULL,      -- メニューID
        TITLE_ID SMALLINT NOT NULL,     -- タイトルID
        CHARA_DATA CHAR(32) NOT NULL,   -- キャラデータ名
        REFIX_DATE DATE NOT NULL,       -- 更新日
	PRIMARY KEY (UP_DATE, MENU_ID,TITLE_ID,CHARA_DATA),
	FOREIGN KEY(MENU_ID,TITLE_ID,CHARA_DATA) REFERENCES
	WAHTS_NEW(MENU_ID,TITLE_ID,CHARA_DATA)
);

が正解とか.

もう一度ER図を書くなどして,テーブル設計を見直した方がよいような気がし
ます.
--
Tatsuo Ishii



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