在sql server中,我可以做到这一点
CREATE UNIQUE INDEX [IX_MyTable_Reference] ON [dbo].[MyTable] ([Reference]) WHERE [Expired] = 0
firebird中是否有一个等价物?
xxls0lw81#
不幸的是没有。firebird没有条件(或部分)索引。我可以想到两种可能的选择:使用唯一的计算索引 Reference 什么时候 Expired 是0和 null 否则:
Reference
Expired
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约束或触发器来检查当前表的内容,不会阻止并发事务插入重复项,也不会获得部分索引的好处。
iif("Expired" = 0, "Reference", null) = <somevalue>
"Expired" = 0 and "Reference" = <somevalue>
1条答案
按热度按时间xxls0lw81#
不幸的是没有。firebird没有条件(或部分)索引。
我可以想到两种可能的选择:
使用唯一的计算索引
Reference
什么时候Expired
是0和null
否则:此索引将强制唯一性,但只能在实际使用的查询中用作索引本身
iif("Expired" = 0, "Reference", null) = <somevalue>
,这使得作为索引使用比作为部分索引(您可以使用"Expired" = 0 and "Reference" = <somevalue>
).使用一个触发器填充一个单独的表,该表可以通过唯一约束(或索引)和一个触发器强制执行唯一性,该触发器在删除时删除记录(或使用级联外键约束),或者
Expired
价值变化。这个解决方案没有在查询时提供索引的好处(除了可能通过显式连接附加表)。
鉴于此解决方案的复杂性,我将此作为练习留给读者。
其他可能的替代方法,如使用check约束或触发器来检查当前表的内容,不会阻止并发事务插入重复项,也不会获得部分索引的好处。