Postgres条件唯一约束没有选择

时间:2017-10-04 01:34:56

标签: sql postgresql postgresql-9.4

我有下表:

汽车:身份证,姓名,身份

我希望一旦我们拥有状态为SOLD的该名称的记录,就会对该车的名称强制执行条件约束。

示例:

1, 'BMW', 'NEW'
2, 'BMW', 'NEW'
3, 'BMW', 'SOLD'
4, 'BMW', 'NEW'

前3条记录应该插入正常。但是不应该插入第4条记录,因为我们现在拥有状态为SOLD的宝马。

这是我尝试过的:

CREATE UNIQUE INDEX cars_sold ON cars (name) WHERE (status = 'SOLD');

这不像我希望的那样有效。这只能确保我们不能拥有BMW

的2 SOLD

注意:我可以使用INSERT SELECT完成此操作,但此表会变得非常大,因此我希望执行唯一约束。我也看到我可以使用CONSTRAINT CHECK执行此操作,但我相信它基本上是SELECT

无论如何在没有大型桌子SELECT的性能影响的情况下完成此操作?从概念上讲,似乎我总是要做SELECT

1 个答案:

答案 0 :(得分:0)

您将无法使用约束执行此操作,因为约束始终会检查数据库的当前状态,并且不会考虑应用修改的顺序。

我认为您最好使用BEFORE INSERT触发器解决问题,该触发器为具有相同名称和状态SELECT的汽车运行SOLD语句。您在问题中创建的唯一部分索引应该会使SELECT非常快,无论表格有多大。