Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无选择的Postgres条件唯一约束_Sql_Postgresql_Postgresql 9.4 - Fatal编程技术网

Sql 无选择的Postgres条件唯一约束

Sql 无选择的Postgres条件唯一约束,sql,postgresql,postgresql-9.4,Sql,Postgresql,Postgresql 9.4,我有下表: 汽车:身份证、姓名、状态 我想在我们有一个状态为“已售出”的汽车名称记录后,立即对汽车名称实施条件约束 例如: 1, 'BMW', 'NEW' 2, 'BMW', 'NEW' 3, 'BMW', 'SOLD' 4, 'BMW', 'NEW' 前3条记录应该插入得很好。但是第四条记录不应该被插入,因为我们现在有一辆宝马,它的状态已经售出 这就是我尝试过的: CREATE UNIQUE INDEX cars_sold ON cars (name) WHERE (status = 'SO

我有下表:

汽车:身份证、姓名、状态

我想在我们有一个状态为“已售出”的汽车名称记录后,立即对汽车名称实施条件约束

例如:

1, 'BMW', 'NEW'
2, 'BMW', 'NEW'
3, 'BMW', 'SOLD'
4, 'BMW', 'NEW'
前3条记录应该插入得很好。但是第四条记录不应该被插入,因为我们现在有一辆宝马,它的状态已经售出

这就是我尝试过的:

CREATE UNIQUE INDEX cars_sold ON cars (name) WHERE (status = 'SOLD');
这并不像我希望的那样有效。这只能确保我们不能有2宝马出售

注意:我可以通过INSERT SELECT来实现这一点,但是这个表将变得非常大,因此我希望获得唯一约束强制的性能。我还看到,我可以用约束检查来完成这项工作,但我相信它基本上可以在引擎盖下进行选择


在大表上执行SELECT操作时,是否可以实现这一点?从概念上讲,我似乎总是要做一个选择< /p> ,因为约束总是检查数据库的当前状态,而不考虑修改应用的顺序。
我认为最好使用BEFORE INSERT触发器来解决这个问题,该触发器为具有相同名称和销售状态的汽车运行SELECT语句。无论表格有多大,您在问题中创建的唯一部分索引都应该使选择速度非常快。

我认为您必须为此使用触发器。数据结构很奇怪。为什么不直接更新?@GordonLinoff触发器必须运行引擎盖下的选择吗?我真的在努力避免select对性能的影响,否则我只会执行insert select。条件涉及当前记录中不可用的信息。可能使用外部表来跟踪状态。我相信我的约束不需要知道应用修改的顺序。它只需要数据库的当前状态。回到我的例子,当应用数字4时,它不关心应用了哪一个订单1、2、3,它只关心3有一辆出售状态的宝马。另外,部分索引将如何帮助我?这是因为索引树现在小得多了,因为它只包含状态为“已售出”的值吗?如果您假设增加的id反映了修改的时间,那么您是对的,但如果存在高并发性,则不要指望这一点。但我想不出一个约束条件能反映这一点。部分索引将是快速的,因为它是唯一的-它快速命中匹配的叶条目,并且不需要扫描。