2017-04-26 2 views
0

Pouvez-vous spécifier une clé primaire à plusieurs colonnes interchangeables?Clé primaire Sqlite sur plusieurs colonnes interchangeables

J'ai créé une table qui stocke des amitiés entre les utilisateurs:

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

Je ne veux pas avoir des amitiés dupliqués donc s'il y a une entrée comme: « John », « Jack » Je ne veulent 'Jack', 'John' à ajouter.

Quelle est la meilleure façon de le faire? Je vous remercie!

+1

Ceci est une faq. Par exemple google 'stackoverflow sql symétrique relation' '. – philipxy

Répondre

1

Je ne vois pas de moyen d'obtenir cela par UNIQUE ou PRIMARY KEY contraintes seulement. Vous pouvez utiliser déclencheur bien (en plus de la contrainte PRIMARY KEY):

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

Pour vous assurer que vous ne disposez pas des paires en double, vous pouvez ajouter la contrainte que les premières valeurs doivent toujours être inférieure à la seconde valeur:

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

Mon problème ici est que je n'aurai pas toujours les deux combinaisons. Si vous êtes amis avec Jack et John, les deux vous diront leur amitié, mais si vous ne connaissez que John, vous ne saurez pas qu'il est ami avec Jack. –

+0

Mais je suppose que je pourrais commander les cordes avant de les insérer dans la table. –