Postgres主键允许碰撞

时间:2018-09-10 00:19:50

标签: postgresql constraints primary-key collision

表的行为应类似于主键(Item_id,Date,Status)。但是,允许多个取消状态。

Item_id  |Date       |Status   
--------------------------------
1        |2017-01-01 |Cancelled   
1        |2017-01-01 |Cancelled   
1        |2017-01-01 |Completed

在这种情况下,我将能够插入:

('1', '2017-01-01', 'Cancelled')

在这种情况下,查询应该返回错误:

('1', '2017-01-01', 'Completed')

是否可以使用约束或其他实现方式来实现此目标?

1 个答案:

答案 0 :(得分:2)

您要问的是自我冲突。根据定义,主键是唯一的,因此,如果主键为(Item_id,Date,Status),则不可能有多个行具有相同的元组(Item_id,Date,Status)。例如,如果两个行都由同一个元组标识(1,2018-01-01,'canceled'),将无法区分它们。

您似乎希望对每个元组(item_id,日期)强制执行一个completed行,这是可行的:请参见this question。您将需要在表中添加一个主键列。