1

以前にこの質問をしましたが、答えは私が探していたものではありませんでした。

コードを使用せずに Asp.net でテーブルを作成しました。2 つの列が含まれています。

YourUserId と FriendUserId

これは多対多の関係です。

私が欲しいものは次のとおりです。

あなたの名前が UserId である複数のレコードが存在する可能性があります。また、FriendUserId が同じである複数のレコードが存在する可能性もありますが、両方が同じである複数のレコードが存在することはできません。例えば:

デイブ:グレッグ

デイブ:クリス

グレッグ:クリス

クリス:グレッグ

いいね

デイブ:グレッグ

デイブ:グレッグ

よくない。

テーブルを右クリックして、[インデックス/キー] を選択しました。次に、両方の列を列セクションに配置し、一意にすることを選択しました。これにより、全体としてはユニークになりますが、個別にはユニークではないと思いました。

データセットに移動すると、両方の列の横にキーが表示され、両方の列がチェックされているという制約があることがわかります。

個々の列を一意にすることなく、レコードの重複コピーをテーブルに挿入していないことを確認する方法はありますか?

SQL挿入ステートメントでそれを制御しようとしましたが、うまくいきませんでした。これは私が試したものです。

INSERT INTO [FriendRequests] ([UserId], [FriendUserId]) VALUES ('"+UserId+"', '"+PossibleFriend+"') WHERE NOT EXIST (SELECT [UserId], [FriendUserId] FROM [FriendRequests])

それは何らかの理由で機能しませんでした。ご協力ありがとうございました!

4

3 に答える 3

3

行の重複を防ぐために、複合主キーを作成する必要があります。

ALTER TABLE FriendRequests
ADD CONSTRAINT pk_FriendRequests PRIMARY KEY (UserID, FriendUserID)

または、テーブル デザイナーで両方の列を選択し、右クリックしてキーとして設定します。

自己友好を防ぐには、CHECK制約を作成します。

ALTER TABLE FriendRequests
ADD CONSTRAINT ck_FriendRequests_NoSelfFriends CHECK (UserID <> FriendUserID)

テーブル デザイナーの任意の場所を右クリックし、[チェック制約] をクリックして [追加] をクリックし、式を次のように設定することで、デザイナーにチェック制約を追加できます。UserID <> FriendUserID

あなたはこの質問を見たいかもしれません

于 2009-04-02T17:39:00.680 に答える
1

両方のフィールドを単一のキーにするために複合キーが必要なようです。

于 2009-04-02T17:38:48.917 に答える
0

もっと良い考えがあります。新しいテーブルを作成します。FriendRequestRelationships と呼ばれます。次の列があります

FriendRelationshipId (主キー) UserId_1 (外部キー制約) UserId_2 (外部キー制約)

UserId_1 および UserId_2 との関係を 1 つだけ許可する一意の制約を設定します。このテーブルは、多対多のリレーションシップ ハーネスとして機能します。

UserId の FriendUserId を返すことができるスカラー関数を作成します。たとえば、fn_GetFriendUserIdForUserId と呼ばれます。

次のクエリを実行して、関係を表示できるようになりました

選択 dbo.fn_GetFriendUserIdForUserId(UserId_1) AS 'Friend1', dbo.fn_GetFriendUserIdForUserId(UserId_2) AS 'Friend2', FROM FriendRelationshipId

于 2009-04-02T17:45:27.747 に答える