首页 > 解决方案 > Postgres 主键允许冲突

问题描述

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

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

标签: postgresqlconstraintsprimary-keycollision

解决方案


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

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


推荐阅读