2016-05-09 52 views
0

這是我的表Friendship(user_id1:integer, user_id2:integer)立新世紀在兩列對稱

我想約束添加到數據庫中,這樣,如果其對稱的已經存在了幾個USER_ID將被拒絕。

例如,如果我已經在數據庫中的情侶(42, 17),我不希望能夠保存(17, 42)

我使用導軌和PostgreSQL的。

回答

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)來驗證您的應用程序是否按上面定義的方式運行。

在Oracle中,這將是

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供應商的。