【问题标题】:Postgres primary key allowing collisionPostgres 主键允许冲突
【发布时间】:2019-02-14 09:47:23
【问题描述】:

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

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

【问题讨论】:

  • 可以分享一下表格的结构吗?它是如何创建的?
  • 问题是如何构造表来实现这种行为。
  • 应允许具有相同 Item_id 和 Date 的多个“取消”状态。
  • 明白了。看我的回答

标签: postgresql constraints primary-key collision


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多