2012-11-17 24 views
1

我不確定我是否正確表達了這個問題,所以我會嘗試更長時間的解釋。我有這種表的:如何在多列之間執行類似集合的唯一性?

CREATE TABLE x (a int, b int); 

我要考慮對(A,B)是相同的,以(B,A),並禁止重複的插入。如果PostgreSQL的有set數據類型,我可能會申報表是這樣的:

CREATE TABLE x (
    ab set, 
    UNIQUE (ab) 
); 

不過,這並不有啥這樣做的最佳方式?

回答

4
create unique index idx_unique_ab 
    on x (least(a,b), greatest(a,b)); 
1

我只是強制一對只能單向存儲,然後創建一個常規的唯一約束。

CREATE TABLE x 
    (
    a INT, 
    b INT, 
    CHECK (a < b), 
    UNIQUE(a, b) 
); 
+0

不幸的是,這會阻止對(2,1)的初始插入,這不符合規則。 – jl6

+0

@ ji6 - 規則表明'(2,1)'在語義上等同於'(1,2)',並且選擇要麼在插入時將其排序,以便插入確保使用一致的格式可以使用觸發器)或按照其他答案以這種格式存儲數據的冗餘副本。 –

相關問題