可空列上的非 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中文網其他相關文章!