2017-04-26 15 views
0

主キーを複数の交換可能な列に指定できますか?複数の交換可能な列にあるSqlite主キー

私は、ユーザー間の友情を格納する表を作成しました:

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

のようなエントリがあるので、もし私が重複して友情を持っている必要はありません:「ジョン」、「ジャックは」私にはありません'ジャック'、 'ジョン'を追加します。

どうすればいいですか?ありがとうございました!

+1

これはfaqです。例えばGoogleの 'stackoverflow SQLの対称関係' '。 – philipxy

答えて

1

UNIQUEまたはPRIMARY KEYという制約のみでは、私はそれを達成する方法がありません。 (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

あなたが重複したペアを持っていない、あなたは最初の値が常に第二の値よりも小さくなければならないという制約を追加することができていることを確認するには:

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

私の問題は、私はいつも両方の組み合わせを持っているとは限りません。あなたがジャックとジョンの友人であれば、どちらもあなたの友情を教えてくれるでしょうが、あなたがジョンを知っていれば、彼はジャックとの友人であることは分かりません。 –

+0

しかし、テーブルに挿入する前に文字列を並べることができたと思います。 –