我想在postgresql中设置一个表,这样两列一起必须是唯一的.任何一个值都可以有多个值,只要没有两个值共享两者.
例如:
CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)
所以,col1和col2可以重复,但不能在同一时间.所以,这是允许的(不包括id)
1 1
1 2
2 1
2 2
但不是这个:
1 1
1 2
1 1 -- would reject this insert for violating constraints
我正在尝试为两列创建一个UNIQUE INDEX约束,但仅当另一列包含值1.例如,column_1并且column_2只有当时才应该是UNIQUE active = 1.包含任何行active = 0可以共享价值观column_1和column_2与另一行,不管其它行的价值是什么active是.但行active = 1不能共享column_1或column_2具有的另一行的值active = 1.
我所说的"共享"是两行在同一列中具有相同的值.示例:row1.a = row2.a AND row1.b = row2.b. 仅当row1中的两列与row2中的其他两列匹配时,才会共享值.
我希望我清楚自己.:\
我有这个拿出几次在我的职业生涯,并没有我的地方的同龄人似乎可以回答这个问题.说我有,有一个"描述"字段是一个候选键,但表有时用户会经由过程中途停止.因此,对于大约25%的记录,此值为null,但对于所有非NULL的记录,它必须是唯一的.
另一个例子是,必须维护多个记录的"版本"的表,和位值表示哪一个是"活动"之一.因此总是填充"候选键",但可能有三个版本相同(在活动位中为0)并且只有一个是活动的(活动位中为1).
我有其他方法来解决这些问题(在第一种情况下,在存储过程或业务层中强制执行规则代码,在第二种情况下,在需要历史记录时使用触发器和UNION表填充表) .我不想要替代方案(除非有明显更好的解决方案),我只是想知道SQL的任何风格是否能以这种方式表达"条件唯一性".我正在使用MS SQL,所以如果有办法在那里做,那很好.我大多只是在学术上对这个问题感兴趣.
sql sql-server sql-server-2005 check-constraints unique-constraint