[pgsql-jp: 34543] Re: 外部キーを追加できない

tomson tomson_lpcjp @ yahoo.co.jp
2004年 12月 25日 (土) 15:38:04 JST


こんにちは。最近ここで勉強させてもらうようになったtomsonです。
お役にたてるかどうかしりませんが。よろしくおねがいいたします。

> create table gyomu."顧客リスト" (
>     "顧客ID"       text primary key,
>     "請求書送付先" text
> );

gyomuスキーマにテーブルを作られたわけですね。
 
> ここで、
> 
> alter table gyomu."顧客リスト"
>     add constraint "請求書送付先"
>     foreign key ("請求書送付先")
>     references gyomu."顧客リスト" ("顧客ID")
>     on delete cascade
>     on update cascade
>     deferrable;

DEFERRABLEになっているので、制約を延期するのですね。
これを使うならば、同時に以下の制約で、「いつまで延期するのか」指定
してやらねばなりませんね。
-------------------------------------------
INITIALLY IMMEDIATE or INITIALLY DEFERRED

    制約が延期可能な場合、この句は制約検査を行なうデフォルトの時期を指定
します。制約が INITIALLY IMMEDIATE の場合、各文の実行後に検査されます。
制約がINITIALLY DEFERRED の場合、トランザクションの終了時にのみ検査され
ます。制約検査の時期は SET CONSTRAINTS コマンドを使用して変更することが
できます。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> ERROR:  insert or update on table "顧客リスト" violates foreign key 
> constraint "請求書送付先"
> DETAIL:  Key (請求書送付先)=() is not present in table "顧客リスト".

列「請求書送付先」の中に「顧客ID」に対応する値がありません。ので、制約を
追加することができません。

主キーと外部キーはかならず「1対多」若しくは「1対1」の関係になっていな
ければなりません。

それを守らせるのがcascade句の意味であり、自動的に値を削除したり追加して
くれるのですが、今回の場合、チェックを遅らせているので、参照整合性が崩れ
てしまいます。

もういちどデータを良く見てみてはいかがでしょうか。

# 余談ですが、postgreSQL8.0.0rc2を導入してみました。
# 今の環境は以下のようになりました。
# PostgreSQL 8.0.0rc2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC)
# 3.2.2 20030222 (Red Hat Linux 3.2.2-5)(1 row)
# 小さな、喜びを感じました(^^;



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