2009-09-03 9 views
1

問題は次のとおりです。2つのフィールドとその逆の固有の制約

私のデータベースに友だちのテーブルがあります。フレンドシップテーブルにはusersテーブルの2つの外部キーがあります。

2つの外部キーに一意のキーを設定して重複がないようにしたいが、もっと必要なものは、ユーザーAがユーザーBを追加した後でBを追加できない場合、テーブル内にAとBの間の友好関係を表す行が1つしかないようにしたい。

このような制約をデータベースサーバーに追加する方法はありますか?

今まで私のコードでこの制約を維持しています。

答えて

2

はい説明したビジネスルールをチェックし、競合が検出された場合にトランザクションをロールバックするトリガーを追加する必要があります。この構文はデータベースによって異なる場合がありますが、SQLサーバーでは

Create Trigger trig_StopRecipFriendships 
    for Insert, Update On Friendships 
    As 
    If Exists (Select * From Friendships F1 
       Join Friendships F2 
        On F1.UserA = F2.UserB 
         And F1.UserB = F2.UserA) 
    Begin 
     Rollback Transaction 
     Raiserror ('These Users are already friends', 16,1) 
    End 
+0

ありがとうございます。 – mpcabd

1

(LEAST(friend1,friend2), GREATEST(friend1,friend2))に一意制約を追加できます。正確な表現は、使用されているRDBMSに依存することがあります。

関連する問題