兩列

2017-12-18 58 views
2

假設之間唯一的Postgresql> = 10,有一個方法來約束的表爲在(或更多)個列唯一值?也就是說,一個值只能出現在一列中。我想盡可能避免觸發器。對於一個單一的列將是微不足道的。兩列

讓我們有這個表:

CREATE TABLE foo (
    col1 INTEGER, 
    col2 INTEGER 
); 

所以應該

1 2 
4 3 
5 7 

雖然8 4是不可能的,因爲有4 3了。

到目前爲止,我想它可能是可能的限制EXCLUDE ((ARRAY[col1, col2]) WITH &&),但似乎不支持(沒有?):

ERROR: operator &&(anyarray,anyarray) is not a member of operator family "array_ops" 

這個要求也可以看起來就像一個空的內部連接表(on a.col1 = b.col2)。我想我可以使用觸發器,但我想盡可能避免它們。

P. S.這裏是a related question

+0

你能解釋爲什麼你需要它嗎?我認爲它打破了[Nothing but the key](https://en.wikipedia.org/wiki/Third_normal_form#「Nothing_but_the_key」)規則。或者,也許這是[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? – Adam

+1

你如何使用這兩個數字?爲什麼不能用一個整數列創建一個表,例如一個'varchar'列指示它是用作「col1」還是「col2」(這些名稱並不真正有用)。你可以使用一個簡單的唯一索引 –

+0

@a_horse_with_no_name:'col1'和'cols2'確實意味着這些值同樣重要且可以互換。他們不能在一列中,因爲這些值應該組合成對。 – Igor

回答

1

我敢用戶this answer是相當接近,你希望達到什麼樣的,但是,作爲在答覆中提到。沒有這樣做的方式,因爲它不是常見的做法。 在編程時,如果發生這種情況,最好是執行一些數據庫重構來找到另一種更理想的解決方案。 希望有任何幫助!