2011-05-12 81 views
8

我在SQL Server 2005中有一個外鍵的表,並且我希望外鍵是唯一值或爲null。我將它設置爲一個唯一的鍵,但它不會讓我在同一個表中有多個空值。有可能做我想做的事嗎?具有空值的SQL Server 2005唯一鍵

回答

9

這是一個很長時間抱怨SQL Server的唯一約束/索引。最好的解決辦法是創建架構綁定視圖,然後把一個唯一索引的列:

Create View dbo.MyUniqueColView 
With SchemaBinding 
As 
Select MyColToBeUnique 
From MyTable 
Where MyColToBeUnique Is Not Null 

GO 

Create Unique Clustered Index IX_MyTable_MyColToBeUnique On MyUniqueColView (MyColToBeUnique) 
0

在SQL Server 2008中,您可以創建在不是空值的filtered index - 不幸的是,這是在2008年發佈了新的功能,因此在2005年,你不能夠做​​任何事情一樣, , 恐怕。

1

你不能在SQL Server 2005中的表級的約束強制執行這一點,但您可以創建定義SELECT Col FROM t WHERE Col IS NOT NULL景色,然後在其上創建一個唯一的聚集索引。

0

總是一個煩惱我的。我更喜歡標準的「其他」解釋。

請參閱Creating a unique constraint that ignores nulls in SQL Server。它涵蓋了三種不同的方法。

  1. 解決方案1:過濾索引。

    從其他答覆來看,這看起來很常見。我還沒有嘗試過這種方法 - 但它確實需要 SQL Server 2008的

  2. 解決方法2:在計算列約束

    我已經使用這個,和它的工作。然而,可能需要調整關係和/或添加次要非唯一覆蓋索引(一個用於唯一約束,一個用於索引覆蓋)。

  3. 解決方案3:UDF檢查約束(不推薦)

    啊,TSQL的功率(閱讀:什麼別的處理)。我沒有走下這條路。

快樂編碼。