通常,数据库设计需要对表列进行唯一约束,但仅限于特定情况。 让我们用一个例子来说明这一点:
考虑一个包含 Table
、ID
和 Name
列的表 RecordStatus
。 RecordStatus
可以是 1(活动)或 2(删除)。 目标是仅对活动记录(其中 ID
= 1)强制执行 RecordStatus
列的唯一性,允许已删除记录重复。
虽然触发器可以实现这一点,但更高效、更强大的解决方案是使用过滤索引。
过滤索引在表数据的子集上创建索引,由过滤条件定义。这允许精确控制索引,非常适合条件唯一或主键约束。
要仅当 ID
为 1 时强制 RecordStatus
上的唯一性,请使用以下命令:
<code class="language-sql">CREATE UNIQUE INDEX MyIndex ON MyTable(ID) WHERE RecordStatus = 1;</code>
这会在 ID
列上创建唯一索引,但仅考虑 RecordStatus
等于 1 的行。
尝试插入重复的 ID
值且 RecordStatus
= 1 将导致错误,类似于:
<code>Msg 2601, Level 14, State 1, Line 13 Cannot insert duplicate key row in object 'dbo.MyTable' with unique index 'MyIndex'. The duplicate key value is (9999).</code>
过滤索引提供了一种干净高效的方法来创建条件唯一约束。 它们增强了数据完整性,而没有通常与触发器相关的性能开销,为复杂的数据库需求提供了更具可扩展性和可维护性的解决方案。 通过精确定义过滤条件,您可以有选择地强制唯一性,与特定业务规则完美契合。
以上是如何仅在满足特定条件时对表列创建唯一约束?的详细内容。更多信息请关注PHP中文网其他相关文章!