firebird中的sql条件唯一索引

cs7cruho  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(382)

在sql server中,我可以做到这一点

CREATE UNIQUE INDEX [IX_MyTable_Reference]
    ON [dbo].[MyTable] ([Reference])
    WHERE [Expired] = 0

firebird中是否有一个等价物?

xxls0lw8

xxls0lw81#

不幸的是没有。firebird没有条件(或部分)索引。
我可以想到两种可能的选择:
使用唯一的计算索引 Reference 什么时候 Expired 是0和 null 否则:

create unique index "IX_MyTable_Reference" 
  on "MyTable" 
  computed by (iif("Expired" = 0, "Reference", null));

此索引将强制唯一性,但只能在实际使用的查询中用作索引本身 iif("Expired" = 0, "Reference", null) = <somevalue> ,这使得作为索引使用比作为部分索引(您可以使用 "Expired" = 0 and "Reference" = <somevalue> ).
使用一个触发器填充一个单独的表,该表可以通过唯一约束(或索引)和一个触发器强制执行唯一性,该触发器在删除时删除记录(或使用级联外键约束),或者 Expired 价值变化。
这个解决方案没有在查询时提供索引的好处(除了可能通过显式连接附加表)。
鉴于此解决方案的复杂性,我将此作为练习留给读者。
其他可能的替代方法,如使用check约束或触发器来检查当前表的内容,不会阻止并发事务插入重复项,也不会获得部分索引的好处。

相关问题