我在一个允许null的表中有列,但是我想制作使其为null或唯一的约束...我该怎么做?
注意:我从前端验证它,但我想在sql server中有一个物理,允许这个甚至开发人员尝试输入数据
答案 0 :(得分: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
请参阅:
答案 1 :(得分: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)
答案 2 :(得分:0)
您不能通过该列上的常规唯一约束使可空列唯一,但您可以通过基于函数的索引实现约束,不知道sql server上是否存在这样的contruct但可能解决它在oracle数据库上