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