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