两列

2017-12-18 63 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是相当接近,你希望达到什么样的,但是,作为在答复中提到。没有这样做的方式,因为它不是常见的做法。 在编程时,如果发生这种情况,最好是执行一些数据库重构来找到另一种更理想的解决方案。 希望有任何帮助!