2009-05-10 15 views
3

Wenn ich eine Verbindungstabelle mit zwei Spalten habe, TeamA und TeamB, wie kann ich sicherstellen, dass jedes Paar eindeutig ist?Eindeutige Spaltenpaare wie A, B oder B, A

Offensichtlich kann ich einen einzigartigen zusammengesetzten Index auf diese Spalten setzen, aber das wird nur Eindeutigkeit in der Reihenfolge A, B, aber nicht B, A korrekt? Wie Sie sehen können, wurde Rot gegen Blau bereits als der erste Datensatz angegeben und dann wird es als der letzte Datensatz erneut angegeben.

Dies sollte illegal sein, da sie sich bereits gegenüberstehen.

Edit: Gibt es auch eine Möglichkeit, den SELECT-Fall zu behandeln? Oder das UPDATE? LÖSCHEN? Etc.

Auch die Idee des Heim- oder Auswärts-Teams wurde angesprochen, was hier wichtig sein könnte. Dieses erste Konzept kam mir, als ich darüber nachdachte, wie man ein Bracketing-System auf der DB-Seite bauen könnte.

Antwort

2

Wenn Ihr RDBMS (Sie haben nicht angegeben) Trigger unterstützt, erstellen Sie einen Trigger für diese Tabelle, um die Einschränkung zu erzwingen.

Erstellen Sie einen Auslöser, der auf INSERT ausgelöst wird, der überprüft, ob ein Paar bereits mit umgekehrter Reihenfolge vorhanden ist. Wenn es ROLLBACK tut, erlauben Sie andernfalls den Einsatz.

+0

Könnten Sie ein wenig genauer sein? Ich weiß, was Auslöser sind, aber ich habe sie nie benutzt. –

3

Definieren Sie eine Integritätsbedingung, z. B. muss der Wert in der A-Spalte (alphabetisch oder numerisch) kleiner als der Wert in der Spalte B sein: Sie dürfen {blau, rot} einfügen, aber nicht {rot, blau} weil blau ist weniger als rot.

+0

Erfasst auch den Fall, dass Sie nicht {rot, rot} oder {blau, blau} haben können. – Apocalisp

+0

aber wie lässt du dann {yellow, blue} zu? Was ist, wenn TeamA in Gelb ist? –

+2

Das würde mir im Wesentlichen sagen, dass die Anwendung dieses Szenario behandeln soll. Gibt es einen besseren Weg? –

1

Hier ist ein Beispielcode für die Triggermethode, die Mitch beschrieben hat.

ich diesen Code nicht getestet haben, und es ist spät in der Nacht hier :-)

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 

Was dies tut sucht, um zu sehen, wenn eine Sequenz von A | B oder B | A in der aktuellen existiert Tabelle. Wenn dies der Fall ist, ist die zurückgegebene Anzahl größer als Null und die Transaktion wird zurückgesetzt und nicht an die Datenbank übergeben.

0

Wenn das gleiche Paar (umgekehrt) existiert, nehmen Sie das 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 
    ) 
Verwandte Themen