2017-04-26 2 views
0

Können Sie einen Primärschlüssel als mehrere austauschbare Spalten angeben?SQL-Primärschlüssel auf mehreren austauschbaren Spalten

Ich habe eine Tabelle erstellt, die Freundschaften zwischen den Benutzern speichert:

CREATE TABLE FRIENDSHIPS (
    AN_USER_ID TEXT NOT NULL, 
    ANOTHER_USER_ID TEXT NOT NULL, 
    PRIMARY KEY (AN_USER_ID, ANOTHER_USER_ID) 
); 

Ich will nicht dupliziert Freundschaften haben, also wenn es einen Eintrag wie: ‚John‘, ‚Jack‘ Ich glaube nicht, Will 'Jack', 'John' hinzugefügt werden.

Was ist der beste Weg, es zu tun? Vielen Dank!

+1

Dies ist eine FAQ. ZB google 'stackoverflow sql symmetrische Beziehung' '. – philipxy

Antwort

1

Ich kann keine Möglichkeit sehen, dass durch UNIQUE oder PRIMARY KEY Einschränkungen nur zu erreichen. Sie könnten Auslöser aber (neben der PRIMARY KEY Einschränkung) verwenden:

CREATE TRIGGER insertCheck 
BEFORE INSERT ON FRIENDSHIPS 
BEGIN 
    SELECT RAISE(ROLLBACK, 'There can be only one combination.') 
    WHERE EXISTS (SELECT * 
        FROM FRIENDSHIPS 
        WHERE ANOTHER_USER_ID = NEW.AN_USER_ID AND AN_USER_ID = NEW.ANOTHER_USER_ID); 
END; 
0

Um sicherzustellen, dass Sie keine doppelten Paare verfügen, könnten Sie die Einschränkung hinzufügen, dass die ersten Werte immer kleiner sein muss als der zweite Wert:

CREATE TABLE Friendships (
    A_User_UD  TEXT NOT NULL, 
    Another_User_ID TEXT NOT NULL, 
    PRIMARY KEY (A_User_ID, Another_User_ID), 
    CHECK (A_User_ID < Another_User_ID) 
); 
+0

Mein Problem hier ist, dass ich nicht immer beide Kombinationen haben werde. Wenn Sie mit Jack und John befreundet sind, werden beide Ihnen von ihrer Freundschaft erzählen, aber wenn Sie John nur kennen, dann würden Sie nicht wissen, dass er mit Jack befreundet ist. –

+0

Aber ich denke, ich könnte die Saiten bestellen, bevor ich sie in die Tabelle stecke. –