可空列上的非 NULL 唯一约束
通常希望在允许空值的同时强制列的唯一性。然而,在 SQL Server 2005 中为 NULLable 列创建唯一索引可能具有挑战性。
当前解决方案
一种常见的解决方法是在物化列上创建唯一索引排除空值的视图:
CREATE VIEW vw_unq WITH SCHEMABINDING AS SELECT Column1 FROM MyTable WHERE Column1 IS NOT NULL CREATE UNIQUE CLUSTERED INDEX unq_idx ON vw_unq (Column1)
更好替代方案
SQL Server 2008 引入了过滤索引,它提供了更好的解决方案:
CREATE UNIQUE INDEX AK_MyTable_Column1 ON MyTable (Column1) WHERE Column1 IS NOT NULL
此索引允许空值,同时强制非空值的唯一性。
附加选项:触发器
另一种替代方法是创建一个触发器来检查插入和更新操作期间的唯一性:
CREATE TRIGGER trg_MyTable_CheckUnique ON MyTable AFTER INSERT, UPDATE AS BEGIN IF EXISTS(SELECT * FROM MyTable WHERE Column1 = NEW.Column1 AND Column1 IS NOT NULL) BEGIN RAISERROR('Duplicate value for Column1.', 16, 1) END END
但是,触发器会影响性能,尤其是在高并发系统上。
以上是如何在 SQL Server 中对可空列实施唯一约束?的详细内容。更多信息请关注PHP中文网其他相关文章!