首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

確保非 NULL 值唯一:CHECK 條件約束替代觸發器

     編輯:關於SqlServer

需求

欄位允許 NULL,但非 NULL 時必須唯一。UNIQUE 約束會限制只能有一個 NULL。

解決方案:計算欄位 + 唯一索引 (SQL Server 2008+)

ALTER TABLE 表 ADD 非NULL唯一鍵 AS CASE WHEN 欄位 IS NULL THEN NULL ELSE 欄位 END
CREATE UNIQUE INDEX UX_表_非NULL唯一 ON 表(非NULL唯一鍵) WHERE 非NULL唯一鍵 IS NOT NULL

或直接建立過濾索引:

CREATE UNIQUE INDEX UX_表_欄位_非NULL ON 表(欄位) WHERE 欄位 IS NOT NULL

舊版相容方案:CHECK 條件約束 + 函數

CREATE FUNCTION fn_CheckUnique(@val INT) RETURNS BIT AS BEGIN
    DECLARE @cnt INT
    SELECT @cnt = COUNT(*) FROM 表 WHERE 欄位 = @val
    RETURN CASE WHEN @cnt > 1 THEN 0 ELSE 1 END
END
GO

ALTER TABLE 表 ADD CONSTRAINT CK_非NULL唯一
CHECK (欄位 IS NULL OR dbo.fn_CheckUnique(欄位) = 1)

觸發器方案 (不推薦,效能差)

CREATE TRIGGER tr_CheckUnique ON 表 FOR INSERT, UPDATE AS
IF EXISTS (
    SELECT 1 FROM inserted i JOIN 表 t ON i.欄位 = t.欄位
    WHERE i.欄位 IS NOT NULL
    GROUP BY i.欄位 HAVING COUNT(*) > 1
)
    ROLLBACK TRAN

建議

SQL Server 2008+ 優先使用過濾唯一索引,效能最好、無額外函數呼叫、維護最簡單。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved