首页 > 解决方案 > MSSQL:在创建表中添加唯一约束并允许 NULL

问题描述

抱歉,可能是菜鸟问题,但我找不到答案。

CREATE TABLE SomeTable
(
   Id DECIMAL NOT NULL,
   UserIdentifier NVARCHAR(100) NULL,
   PRIMARY KEY (Id),
   ????
)

如何在允许 Null 的列 UserIdentifier 上的 CREATE TABLE 中添加唯一键约束?

我知道在 CREATE TABLE 之外,您可以说... WHERE UserIdentifier IS NOT NULL,但在内部?

谢谢!

标签: sql-server

解决方案


假设您想要多行具有 value NULL,您将无法使用 a UNIQUE CONSTRAINT,因为NULL它仍然是一个值(即使是未知的)。例如:

CREATE TABLE dbo.YourTable (UserIdentifier nvarchar(100) NULL,
                            CONSTRAINT UC_UI UNIQUE (UserIdentifier));
GO
INSERT INTO dbo.YourTable (UserIdentifier)
VALUES(NULL);
GO
INSERT INTO dbo.YourTable (UserIdentifier)
VALUES(NULL);
GO
DROP TABLE dbo.YourTable;

注意第二个INSERT失败。

但是,您可以使用条件UNIQUE INDEX

CREATE TABLE dbo.YourTable (UserIdentifier nvarchar(100) NULL);

CREATE UNIQUE NONCLUSTERED INDEX UI_UI ON dbo.YourTable(UserIdentifier) WHERE UserIdentifier IS NOT NULL;

GO
INSERT INTO dbo.YourTable (UserIdentifier)
VALUES(NULL); -- Success
GO
INSERT INTO dbo.YourTable (UserIdentifier)
VALUES(NULL); --Success
GO
INSERT INTO dbo.YourTable (UserIdentifier)
VALUES(N'Steve'); --Success
GO
INSERT INTO dbo.YourTable (UserIdentifier)
VALUES(N'Jayne'); --Success
GO
INSERT INTO dbo.YourTable (UserIdentifier)
VALUES(N'Steve'); --Fails
GO
DROP TABLE dbo.YourTable;

正如 Jeroen Mostert 在评论中所说,您不能在创建表的过程中创建唯一索引;它必须在单独的语句中创建。没有语法可以创建UNIQUE INDEX作为CREATE TABLE语句的一部分。


推荐阅读