TSQL 多列唯一约束也允许多个空值

TSQL Multi Column Unique Constraint That Also Allows Multiple Nulls

我目前正在从 MS Access 迁移到 SQL 服务器。 Access 允许唯一索引中的多个空值,而 SQL 服务器不允许...我一直在通过删除 SQL 服务器中的索引并添加过滤索引来处理迁移:

CREATE UNIQUE NONCLUSTERED INDEX idx_col1_notnull 
ON tblEmployee(col1) 
WHERE col1 IS NOT NULL;

我遇到的问题是我不确定如何实现复合或多列“过滤”索引...或者这是否真的可行,因为我在研究它时没有找到任何示例。

我确实有一个想法可以通过像这样创建过滤索引来实现它:

CREATE UNIQUE NONCLUSTERED INDEX idx_col1col2_notnull 
ON tblEmployee (col1, col2) 
WHERE col1 IS NOT NULL

然后添加第二个过滤索引:

CREATE UNIQUE NONCLUSTERED INDEX idx_col2col1_notnull 
ON tblEmployee (col1, col2) 
WHERE col2 IS NOT NULL

但我不确定这是否有效,更不用说是最好的方法了。非常感谢正确方向的指导。

您可以添加以下索引以仅索引非可为空的列:

create table tblEmployee(col1 int, col2 int)
go

create unique nonclustered index idx_col1col2_notnull ON tblEmployee(col1,col2) 
where col1 is not null and col2 is not null
go

--This Insert successeds
insert into tblEmployee values
(null, null),
(null, null),
(1, null),
(1, null),
(null, 2),
(null, 2)

--This Insert fails
insert into tblEmployee values
(3, 4),
(3, 4)

您还可以组合多个索引以在可空字段为空的所有字段中保持唯一限制

CREATE TABLE MyTable (
    [Idx_1] [int] NOT NULL,
    [idx_2] [int] NOT NULL,
    [idx_3] [int] NULL,
    [no_index_field] [nvarchar](50) NULL
) ON [PRIMARY]
GO


CREATE UNIQUE NONCLUSTERED INDEX idx_3_fields
ON MyTable (Idx_1, Idx_2, Idx_3)
WHERE Idx_3 IS NOT NULL;

CREATE UNIQUE NONCLUSTERED INDEX idx_2_fields
ON MyTable (Idx_1, Idx_2)
WHERE Idx_3 IS NULL;