2011-01-12 25 views
0

ユーザー(ユーザー)のテーブルがあり、どのユーザーが他のユーザーを参照したかを追跡するために新しいテーブルを作成する必要があります。ですから、基本的には、同じ表の行間に多対多の関係を作成しています。SQL Serverエラーを理解しない

私はUserIdとUserReferredIdという列を持つテーブルUserReferralsを作成しようとしています。私は両方の列を複合主キーにしました。また、両方の列はUser.UserIDにリンクする外部キーです。

ユーザーを削除するとリレーションシップも削除する必要があるため、両方の外部キーをカスケード削除に設定します。ユーザーが削除されると、UserReferrals内の関連する行も削除する必要があります。

しかし、これは私にメッセージを与える:

'User' table saved successfully 'UserReferrals' table Unable to create relationship 'FK_UserReferrals_User'. Introducing FOREIGN KEY constraint 'FK_UserReferrals_User' on table 'UserReferrals' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

私はこのエラーを得ることはありません。カスケード削除では、外部キーを持つ行だけが削除されます。では、どうやって「サイクリング・カスケード・パス」を引き起こすのですか?

ありがとうございます。

+0

誤って外部キー制約の1つを後方に設定していないことは間違いありませんか? –

+0

私はちょうど良い措置のために再度チェックしました。両方の列には、Userテーブルがプライマリキーテーブルとして、UserReferralsが外部キーテーブルとして表示されます。 –

答えて

0

このことを考えた後、私はこの問題は、そんなにそれが複数のカスケードパスに関連することができる限り多くの巡回カスケードパスに関連していないと思い始めています。

私の結合テーブルの2つのユーザーIDは常に異なっていますが、何も同じであることを妨げるものはありません。両方が同じユーザーを参照し、そのユーザーが削除された場合、結合テーブルへの複数のカスケードパスが存在します。

1

テーブル(B)を参照するテーブル(A)にFKがある場合、(A)との関係も同じテーブル内のPKを参照するFKもありますそれは繰り返します。時にはこれは論理的に可能ではありませんが、純粋な理論ではSQLエンジンの目で見ることができます。

これは避けられません。通常、SPで処理します(EFではdeleteメソッドにマップできます)。

+0

外部キーがどのように循環するかを詳しく説明できますか? FKの側だけがカスケードします。だから関係のPK側にどのようにカスケードを引き起こすことができましたか? –

+0

あなたの[User]テーブルに[UserReferals]との関係を介して参照があります。したがって、ユーザAがユーザBを「参照」し、ユーザBがユーザAを参照して周期的カスケードシナリオを引き起こす可能性があります。私が "関係のPK側"を意味していたことは、PKが制約のターゲットでも、テーブル自体も参照している場合です。 – lukiffer

+0

私はちょうどそれを取得していない場合は申し訳ありませんが、両方の列は、関係のFK側にあります。したがって、カスケードはすべてUserReferralsテーブルで終了します。つまり、関係のPK側からのみカスケードするので、削除は関係のFK側からカスケードしません。私の考えがどこに間違っているのか分かりますか? –

0

カスケード削除を許可する場合、他のユーザーのUserReferredIdフィールドにUserIdが表示されているユーザーを削除すると、そのユーザーも削除されます。あなたが望むのは、UserReferredIdの値を、それに関連付けられたUserが削除された場合にnullに設定することです。

削除コマンドのテーブル・トリガーから、削除手順にストア・プロシージャーを使用するまで、いくつかのアプローチがあります。後 として更新ユーザーがUserReferredId = nullをUserReferredId中(削除からユーザーIDを選択)

をテストされていないのですが、必要があることをどこに設定削除ユーザーにトリガーclearUserReferredIdOnUserDeleteを作成

:邪悪な引数ですトリガを無視すると、1のようなものを作成することができます閉じる。

P

+0

ユーザーの1人が削除された場合、それらの関係も削除する必要があります。どちらの列も関係のFK側にあるので、どのように他の列が削除されるのか分かりません。ユーザー内の行を削除した場合にのみ削除できます。 –

関連する問題