2016-05-09 5 views
0

は、これは私がその対称型がすでに存在する場合のuser_idのカップルが拒否されるように、データベースに制約を追加したいFriendship(user_id1:integer, user_id2:integer)単一性

私のテーブルです。例えば

私はすでにDBに夫婦(42, 17)を持っている場合、私は、私は、PostgreSQLとレールを使用してい(17, 42)

を保存できるようにしたくありません。

答えて

0

あなたが式にインデックスを使用して、データベースにこの操作を行うことができます。

create unique index unq_friendship_1_2 
    on (least(user_id1, user_id2), greatest(user_id1, user_id2)); 

私はあなたがレールでこれを表現する方法がわかりません。

0

通常の一意性制約とチェック制約の組み合わせでこれを行うことができます。これは、アプリケーションをある意味で実装でき、小さな値をフィールドuser_id_1に格納し、フィールドの大きな値user_id_2。

(user_id_1、user_id_2)に一意制約を定義すると同時に、(user_id_1 < = user_id_2)というチェック制約によって、アプリケーションが上記のように動作するかどうかが検証されます。

これは、アプリケーションが上記のようにソートされた値を挿入することができない場合、あなたはまだ、例えば使用することができます

ALTER TABLE tablename ADD CONSTRAINT cname1 UNIQUE (user_id_1, user_id_2) 
ALTER TABLE tablename ADD CONSTRAINT cname2 CHECK (user_id_1 <= user_id_2) 

だろうオラクルで

これはDBベンダー固有のものです。

関連する問題