這是我的表Friendship(user_id1:integer, user_id2:integer)
立新世紀在兩列對稱
我想約束添加到數據庫中,這樣,如果其對稱的已經存在了幾個USER_ID將被拒絕。
例如,如果我已經在數據庫中的情侶(42, 17)
,我不希望能夠保存(17, 42)
我使用導軌和PostgreSQL的。
這是我的表Friendship(user_id1:integer, user_id2:integer)
立新世紀在兩列對稱
我想約束添加到數據庫中,這樣,如果其對稱的已經存在了幾個USER_ID將被拒絕。
例如,如果我已經在數據庫中的情侶(42, 17)
,我不希望能夠保存(17, 42)
我使用導軌和PostgreSQL的。
您可以在數據庫上表達式中使用的索引做到這一點:
create unique index unq_friendship_1_2
on (least(user_id1, user_id2), greatest(user_id1, user_id2));
我不知道你是怎麼在鐵軌表達這一點。
如果您能夠以某種方式實現應用程序,並將其存儲在字段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供應商的。