【问题标题】:Create a unique constraint where one column can be null to prevent duplicate record insertion [duplicate]创建一个唯一约束,其中一列可以为空以防止重复记录插入[重复]
【发布时间】:2021-12-06 20:39:20
【问题描述】:

在 Postgres 13.4 中,尝试创建一个唯一约束,其中汽车表中的记录按名称和 user_id 是唯一的。购买日期开始时为 NULL,但一旦购买汽车就可以更改为一个值。我运行以下命令,但出现语法错误:

ALTER TABLE cars 
   ADD CONSTRAINT cars_user_id_name_purchased_at_key 
   UNIQUE (user_id, name) 
WHERE purchased_at IS NULL

错误:

ERROR 42601 (syntax_error) 在“WHERE”或附近出现语法错误

问题是什么以及如何解决?

【问题讨论】:

  • 等等,一旦购买了汽车,您想解除唯一性限制吗?
  • 我更改了名称(因此也更改了域模型)以使生产系统有点模糊;但本质上,您正在按名称创建一辆新车(虽然与一个用户相关联,所以在这个系统中,两个不同的用户可能有相同的汽车名称),我们不想允许重复的名称。将“purchased_at”视为在新车库存中进行软删除,但与用户相关联。
  • 您需要一个唯一的 index 才能使用 WHERE 子句。这对于唯一约束是不可能的
  • @Nona 但是用户可以在软删除第一辆车后创建另一辆同名的汽车吗?
  • @Bergi - 是的,他们可以

标签: postgresql


【解决方案1】:

您不能在约束定义中包含WHERE 子句,但部分唯一索引可以解决问题:

CREATE UNIQUE INDEX ON cars (user_id, name) 
WHERE purchased_at IS NULL;

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 2017-08-13
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多