2009-05-10 12 views
3

TeamAとTeamBの2つの列を持つ結合テーブルがある場合、どのように各ペアが一意であることを確認できますか?A、B、またはBの一意の列ペア

明らかに私はこれらの列にユニークな複合インデックスを付けることができますが、A、Bの順では一意性だけが保証されますが、B、Aでは正しくありませんか?

TeamA | TeamB 
------------- 
red | blue 
pink | blue 
blue | red 

ご覧のとおり、Red vs. Blueは既に最初のレコードとして指定されていて、最後にもう一度指定されています。すでに互いに向かい合っているので、これは違法であるべきです。

編集:また、SELECTケースも処理する方法はありますか?または、更新?削除?その他...

また、ここでは重要なホームチームまたはアウェーチームのアイデアが生まれました。この最初のコンセプトは、DB側でブラケットシステムを構築する方法を考えながら私に来ました。

答えて

2

RDBMS(指定していない)がトリガーをサポートしている場合は、そのテーブルにトリガーを作成して制約を適用します。

INSERTで起動するトリガーを作成します。このトリガーは、順序が逆のペアがすでに存在するかどうかを確認します。 ROLLBACKの場合は、挿入を許可します。

+0

少し具体的に教えてください。私はトリガーが何であるか知っていますが、私はそれらを使ったことはありません。 –

3

たとえば、A列の値がB列の値より(アルファベット順または数値順に)小さくなければならないという制約を定義します。したがって、{青、赤}を挿入することはできますが、 {赤、青}青が赤よりも小さいので。

+0

{赤、赤}または{青、青}を使用できない場合もキャプチャします。 – Apocalisp

+0

しかし、どのように{黄色、青}を許可しますか? TeamAが黄色の場合はどうなりますか? –

+2

これは基本的に、アプリケーションにこのシナリオを処理させるように指示します。より良い方法がありますか? –

1

Mitchが説明したトリガーメソッドで使用するサンプルコードを示します。

私はこのコードをテストしていませんが、それはAのいずれかの配列かどうかを確認するために探しているものは、これはやっている

CREATE TRIGGER trig_addTeam 
ON Teams 
FOR INSERT, UPDATE 
AS 

DECLARE @TeamA VARCHAR(100) 
DECLARE @TeamB VARCHAR(100) 
DECLARE @Count INT 

SELECT @TeamA = (SELECT TeamA FROM Inserted) 
SELECT @TeamB = (SELECT TeamB FROM Inserted) 

SELECT @Count = (SELECT COUNT(*) FROM TEAMS WHERE (TeamA = @TeamA AND TeamB = @TeamB) 
       OR (TeamA = @TeamB AND TeamB = @TeamA)) 

IF @Count > 0 THEN 

BEGIN 
    ROLLBACK TRANSACTION 
END 

:-)ここでは夜遅くだ| BまたはB | Aが現在に存在します表。そうである場合、返されるカウントはゼロより大きく、トランザクションはロールバックされ、データベースにコミットされません。

0

同じペア(反転)が存在する場合は、TeamA> TeamBのいずれかを選択します。

SELECT DISTINCT TeamA, TeamB 
FROM table t1 
WHERE t1.TeamA > t1.TeamB 
    OR NOT EXISTS (
     SELECT * FROM table t2 
      WHERE t2.TeamA = t1.TeamB AND t2.TeamB = t1.TeamA 
    ) 
関連する問題