我有下表:
汽车:身份证,姓名,身份
我希望一旦我们拥有状态为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
SOLD
注意:我可以使用INSERT SELECT
完成此操作,但此表会变得非常大,因此我希望执行唯一约束。我也看到我可以使用CONSTRAINT CHECK
执行此操作,但我相信它基本上是SELECT
。
无论如何在没有大型桌子SELECT
的性能影响的情况下完成此操作?从概念上讲,似乎我总是要做SELECT
答案 0 :(得分:0)
您将无法使用约束执行此操作,因为约束始终会检查数据库的当前状态,并且不会考虑应用修改的顺序。
我认为您最好使用BEFORE INSERT
触发器解决问题,该触发器为具有相同名称和状态SELECT
的汽车运行SOLD
语句。您在问题中创建的唯一部分索引应该会使SELECT
非常快,无论表格有多大。