sql-server - 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,但在内部?
谢谢!
解决方案
假设您想要多行具有 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
语句的一部分。
推荐阅读
- python - 如何打乱列表,使每个特定长度的子列表都有唯一的项目?
- python - 轮播在 Windows 中运行良好,但在 android 中卡住了
- java - 在 WildFly/CXF Webservice 客户端中使用 DefaultSSLSocketFactory
- css - 在 Safari 的 flexbox 中拉伸图像
- python - 是什么导致此代码模型中的索引错误?
- java - 使用 Mockito (Kotlin) 在间谍对象上引发异常的存根方法
- forms - 如何使本 Powerapps 课程中有关编辑表单的代码生效?
- javascript - 检测浏览器对 CSS @Page 属性的支持
- r - 使用 read_sas 有效地将 SAS 导入到 R 循环中,要导入的列因文件而异
- java - Java 线程池 - 尝试生成 n 矩阵