【发布时间】: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