- PR -

連鎖参照整合性制約について

1
投稿者投稿内容
Yoko
常連さん
会議室デビュー日: 2004/11/16
投稿数: 20
投稿日時: 2005-04-13 09:55
環境:SQLServer2000 SP3a + WindowsXP SP2

こんにちは。いつもお世話になってます。

外部キーを連鎖参照整合性制約(ON UPDATE CASCADE)で作成しようとしたところ、いくつかのキー作成時に以下のエラーが発生してしまいました。

----------------------------------------------------
テーブル '[テーブル名]' に設定しようとしているFOREIGN KEY 制約
'[制約名]' はパスが循環するか、複数に連鎖する可能性があります。
ON DELETE NO ACTION、ON UPDATE NO ACTION、を指定するか、
ほかの FOREIGN KEY 制約を変更してください。
----------------------------------------------------

エラーが発生したパターンを見てみると、
同一テーブル内で参照していたり、2テーブル間で複数参照していたり、3テーブル以上で相互に参照していたり・・・
とにかくテーブルレベルで循環するような形になっていると、
キーとなるカラムが何であろうと、エラーになってしまうようですね。

(テーブルで見ると連鎖するみたいに見えるけど、
 カラムが異なるから連鎖も循環もしないよ!と言いたいのですが...
 だからメッセージでは「可能性」と言っているのでしょうね...)

そこでこのエラーを避ける方法を色々と調査してみたところ、
大きく分けて以下の2つの方法が挙げられました。

 a.連鎖更新しなくて済むような値(内部的な不変の値)を設けて、
  キーをそのカラムに変更する
 b.連鎖更新を使用せずにUPDATEトリガーで代替する

a.は設計の都合上変更するわけには行かずに断念せざるを得なかったので
b.を試してみたのですが、ON UPDATE CASCADEを設定しないどころか、
参照しない(NO CHECK)にしないとダメなんですね。

そこで、質問なのですが、
1.NO CHECKの外部キーって意味があるのでしょうか?
2.他に当該エラーを回避する方法はありますのでしょうか?

長文&漠然とした質問で申し訳ありませんが
よろしくお願いいたします。
1

スキルアップ/キャリアアップ(JOB@IT)