Postgres主键允许碰撞

问题描述 投票:0回答:1

该表应具有与主键(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')

有没有办法使用约束或其他实现来实现这一目标?

postgresql constraints primary-key collision
1个回答
2
投票

你问的是自相矛盾的。根据定义,主键是唯一的,因此如果主键是(Item_id,Date,Status),则不可能有多个具有相同元组的行(Item_id,Date,Status)。例如,如果两行都由相同的元组标识,则无法区分2行(1,2018-01-01,'已取消')

看起来你想要为每个元组(item_id,date)强制执行一个completed行,这是可行的:请参阅this question。您需要在表中添加主键列。

© www.soinside.com 2019 - 2024. All rights reserved.