2010-09-28 43 views

回答

1

到SQL Server 2000上的作品,後來篩選的索引的替代方案是一個indexed view.

喜歡的東西:

CREATE VIEW DRI_YourTable_NonNullUnique 
WITH SCHEMABINDING 
AS 
    SELECT YourColumn FROM dbo.YourTable WHERE not YourColumn is NULL 
GO 
CREATE UNIQUE CLUSTERED INDEX IX_DRI_YourTable on DRI_YourTable_NonNullUnique (YourColumn) 

請注意,你不這樣做一旦創建了這個視圖,必須做任何特別的事情 - 你不需要再次引用它。如果試圖在基表中插入非唯一值,它只會導致發生約束違規。

@marc_s - 我不同意。他們肯定不會在下面Enterprise版本自動視爲(查詢編譯),但他們絕對可創建和工作的DRI執法中的所有版本:

select @@VERSION 

create table dbo.T1 (
    T1ID int IDENTITY(1,1) not null, 
    Val1 varchar(10) null, 
    constraint PK_T1 PRIMARY KEY (T1ID) 
) 
go 
create view dbo.DRI_T1_Val1Unique 
with schemabinding 
as 
    select Val1 from dbo.T1 where Val1 is not null 
go 
create unique clustered index IX_DRI_T1_Val1Unique on dbo.DRI_T1_Val1Unique (Val1) 
go 
insert into dbo.T1 (Val1) 
select 'abc' union all 
select null union all 
select null 
go 
insert into dbo.T1 (Val1) 
select 'abc' 
go 
select * from dbo.T1 

結果:

Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2) 

1 abc 
2 NULL 
3 NULL 

而且:

(1 row(s) affected) 

(3 row(s) affected) 
Msg 2601, Level 14, State 3, Line 1 
Cannot insert duplicate key row in object 'DRI_T1_Val1Unique' with unique index 'IX_DRI_T1_Val1Unique'. 
The statement has been terminated. 

(0 row(s) affected) 

(3 row(s) affected) 
+0

但索引視圖僅在企業版本中可用 - 在Express,Workgroup或Standard版本中無法使用:-( – 2010-09-28 06:49:05

1

不幸的是,你不能在SQL Server 2005中做到這一點。唯一索引只允許一行NULL值。

使用SQL Server 2008,您可以使用已過濾索引 - 僅在部分行上定義的索引,例如,那些不是空的。這是一個2008年的功能,所以你將不能夠做到這一點在2005年

CREATE UNIQUE NONCLUSTERED INDEX IX_UNIQUE 
ON dbo.YourTable(YourColumn) 
WHERE YourColumn IS NOT NULL 
GO 

參見:

0

你不能讓一個可空列通過該列上的常規唯一約束唯一,但是您可以通過基於函數的索引實現該約束,不知道這樣的構造是否存在於sql服務器b上UT可能解決它在Oracle數據庫上

相關問題