Sql-Server

部分唯一檢查約束

  • October 30, 2017

我有一個正在遷移到 SQL Server 的舊 Access 表,其中有一個名為“LinkedID”的欄位。該欄位在大約 5 年前大部分未使用,因此對於許多歷史記錄,它要麼為空,要麼預設為“00000000”。但是,展望未來,我們希望將其設置為不允許重複值(假設 1,000 條記錄為空,500 條為“00000000”,大約 10,000 條是我們想要的實際唯一值)。

調查一下,由於我有多個設置為“00000000”的記錄和多個為空的記錄,我知道我不能使用唯一約束。有沒有一種方法可以創建一個檢查約束來檢查插入/更新的值是否是唯一的(如果不是全 0 或空值)?或者如果它不能通過檢查約束來工作,我的另一個想法可能是使用插入/更新觸發器以某種方式驗證數據?

您可以為此使用過濾的唯一索引

CREATE UNIQUE INDEX LinkedID_Unique_except_Zeroes_or_Null 
   ON dbo.oldAccessTable (LinkedID)  
   WHERE LinkedID <> '00000000' ;  

條件 ( LinkedID <> '00000000') 滿足這兩個要求,即忽略或不儲存在索引中的行'00000000'NULL因此不檢查它們的唯一性。

引用自:https://dba.stackexchange.com/questions/189675