我目前正在从MS Access迁移到SQL Server。由于Access允许在唯一索引上有多个Null,而SQL Server没有...我通过删除SQL Server中的索引并添加过滤索引来处理迁移: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
但我不确定这是否可行,更不用说是最好的方法了。我们将非常感谢正确方向的指导。
答案 0 :(得分:7)
您可以添加以下索引以仅索引不可为空的列:
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)
答案 1 :(得分:0)
您还可以组合多个索引,以在所有可为空字段为null的字段中保持唯一的权限
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;