1

我在一个表中有一个允许 null 的列,但我想做出使他为 null 或唯一的约束……我该怎么做?
注意:我从前端验证它,但我希望有一个物理的 sql 服务器,允许这个甚至开发人员尝试输入数据

4

3 回答 3

1

不幸的是,您不能在 SQL Server 2005 中执行此操作。唯一索引只允许一行 NULL 值。

在 SQL Server 2008 中,您可以使用过滤索引- 仅在部分行上定义的索引,例如那些不为 NULL 的行。这是 2008 年的功能,因此您将无法在 2005 年执行此操作。

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

看:

于 2010-09-28T06:33:42.670 回答
1

在 SQL Server 2000 及更高版本上工作的筛选索引的替代方法是索引视图。

就像是:

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)
于 2010-09-28T06:39:03.970 回答
0

您不能通过对该列的正常唯一约束使可为空的列唯一,但您可以通过基于函数的索引实现约束,不知道这样的结构是否存在于 sql server 上,但可能会在 oracle 上解决它数据库

于 2010-09-28T06:38:02.377 回答