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

SAISHO Kazuhiro ml @ saisho.info
2004年 12月 25日 (土) 21:59:56 JST


質問させて戴いた税所です。
どうもありがとうございました。

[pgsql-jp: 34543]
> > create table gyomu."顧客リスト" (
> >     "顧客ID"       text primary key,
> >     "請求書送付先" text
> > );
> 
> gyomuスキーマにテーブルを作られたわけですね。

はい、ご高察のとおりです。


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

おっしゃっているチェックは値が変更・削除された場合のタイミングであって、
今回の場合は、外部キーの設定の時点でのエラーですので、
ちょっと意味合いが異なるような気が致しますが、
私の認識違いでしたら申し訳ありません。


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

おっしゃるとおりでした。
参照先に存在しない '' が参照元に含まれていました。
お騒がせ致しました。
で、deferrableの場合、一旦 '' が挿入されるなどしても、
チェックの前に、参照先に存在する値に変更されれば
チェックの時点ではエラーにならないということですよね?


ご教授どうもありがとうございました。

--
税所 一弘 <ml @ saisho.info>




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