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