2011-08-09 66 views
2

我有以下scehma我可以在一個NULLable字段上有獨特的約束嗎?

CREATE TABLE MyTable 
( 
    ID    INTEGER DEFAULT(1,1), 
    FirstIdentifier INTEGER NULL, 
    SecondIdentifier INTEGER NULL, 
--.... some other fields ..... 
) 

現在每個FirstIdentifier & SecondIdentifier isUnique設置爲null的,但一個表。我想對每個列都設置一個唯一的約束,但不能這樣做,因爲它的NULLable可以有兩行NULL值,這些行將失敗唯一的約束。關於如何在模式級別解決它的任何想法?

+0

添加一些觸發器來捕獲插入/更新並在該級別執行唯一性檢查? –

+0

如何製作FirstIdentifier和Secondidentifier組合鍵? – Vinay

+0

您是否正在嘗試創建候選密鑰{FirstIdentifier,SecondIdentifier}或'Candidate Key1 {FirstIdentifier}','Candidate Key2 {SecondIdentifier}' –

回答

7

您可以使用篩選索引作爲唯一約束。

create unique index ix_FirstIdentifier on MyTable(FirstIdentifier) 
    where FirstIdentifier is not null 
0

你的問題有點混亂。首先,在你的模式定義中,你說你的列不允許保存空值,但是在你的描述中,你說他們可以爲空。

無論如何,假設您的模式錯誤,並且您確實希望列允許空值,SQL Server允許您通過將WHERE IS NOT NULL添加到約束來執行此操作。

線沿線的東西:

CREATE UNIQUE NONCLUSTERED INDEX IDX_my_index 
ON MyTable (firstIdentifier) 
WHERE firstIdentifier IS NOT NULL 
0

請在字段篩選唯一索引:

CREATE UNIQUE INDEX ix_IndexName ON MyTable (FirstIdentifier, SecondIdentifier) 
    WHERE FirstIdentifier IS NOT NULL 
    AND SecondIdentifier IS NOT NULL 

它將使NULL但仍然強制唯一性。

0

您可以使用過濾器謂詞在CREATE INDEX

CREATE INDEX

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX INDEX_NAME
ON(列[ASC | DESC] [,... n])的
[INCLUDE(列[,... n])的]
[WHERE <filter_predicate>]
[WITH( [,... n])]
[ON {partition_scheme_name(column_name)
| filegroup_name
|默認
}
]
[FILESTREAM_ON {filestream_filegroup_name | partition_scheme_name | 「NULL」}]

[; ]

WHERE <filter_predicate>通過指定要包含在索引中的行來創建經過篩選的索引。篩選後的索引必須是表格上的非聚簇索引 。爲已過濾的索引中的 數據行創建過濾的統計信息。

過濾器謂詞使用簡單的比較邏輯,不能引用 計算列,UDT列,空間數據類型列或hierarchyID數據類型列。比較運算符允許使用NULL文字進行比較不是 。改爲使用IS NULL和IS NOT NULL 運算符。

下面是用於 Production.BillOfMaterials表過濾謂詞的一些例子:

WHERE的StartDate> '20040101' AND結束日期< = '20040630'

WHERE的ComponentID IN(533,324,753)

WHERE起始日期IN( '20040404', '20040905')日期和結束日期IS NOT NULL

篩選索引不適用於XML索引和全文索引。 對於UNIQUE索引,只有選定的行必須具有唯一索引 的值。篩選索引不允許使用IGNORE_DUP_KEY選項。

1

正如幾個人所建議的,使用過濾索引可能是獲得你想要的東西的方法。

但是本書回答你的直接問題是,如果列有唯一索引,那麼列可以爲空,但它只能在該字段中有一個空值的行。任何多於一個null都會違反索引。

相關問題