Azure SQL DB 允许 UNIQUE 约束列的 NULL 值

Azure SQL DB allow NULL values for UNIQUE constraint columns

如何在 Azure SQL 数据库中设置允许列中有 NULL 值的 UNIQUE 约束?

来自 SQL 服务器的以下解决方法似乎在 Azure SQL 中不起作用:

CREATE UNIQUE NONCLUSTERED INDEX [IX_Email] ON [dbo].[Users]([Email] ASC)
WHERE ([Email] IS NOT NULL);

评论中的错误告诉您问题所在:

Violation of UNIQUE KEY Constraint "UQ_Users_5120...". Cannot insert duplicate key in object 'dbo.Users'. The duplicate key value is ().

首先,请注意错误状态为“UNIQUE KEY Constraint”,强调我的。 不是索引,约束。另请注意所述约束的名称:UQ_Users_5120... 这不是您创建的对象的名称 (IX_Email)。

您可以使用以下方法重现此问题:

CREATE TABLE dbo.SomeTable (SomeColumn varchar(10) NULL);
GO
--Create a UNIQUE Constraint
ALTER TABLE dbo.SomeTable ADD CONSTRAINT UQ_SomeColumn UNIQUE (SomeColumn);
GO
--Create a filtered unique index
CREATE UNIQUE NONCLUSTERED INDEX UX_SomeColumn_NotNull ON dbo.SomeTable(SomeColumn)
WHERE SomeColumn IS NOT NULL;
GO
--Initial Insert
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES('asdfasd'),
      ('asdasd'),
      (NULL);
GO
--Insert another dupe, non NULL value. Fails
--This violates constraint 'UQ_SomeColumn'
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES('asdfasd');
GO
--Insert another dupe, NULL value. Fails
--This violates constraint 'UQ_SomeColumn'
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES(NULL);
GO

你可以通过删除 UNIQUE CONSTRAINT 来解决这个问题。我们没有全名,但对于上面的示例,它将是以下内容:

ALTER TABLE dbo.SomeTable DROP CONSTRAINT UQ_SomeColumn;
GO

然后我们可以再次测试:

--Insert another dupe, non NULL value. Fails
--Cannot insert duplicate key row in object 'dbo.SomeTable' with unique index 'UX_SomeColumn_NotNull'. The duplicate key value is (asdfasd).
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES('asdfasd');

--Insert another dupe, NULL value. Success
INSERT INTO dbo.SomeTable (SomeColumn)
VALUES(NULL);
GO

还要注意,重复值的错误现在完全不同了。它提到了唯一索引,而不是唯一键约束,并且具有创建的唯一过滤索引的名称,而不是其他名称。