[英]Sqlserver how to create composite unique key with one of column is nullable
我不是索引专家。 我想创建一个复合键唯一约束。 如果其中一列可以为空,如何创建?
CREATE UNIQUE CLUSTERED INDEX [IX_User_Email_PeronsId] ON [dbo].[User]
(
[Email] ASC,
[PersonId] ASC
)
GO
PersonId 是可为空的列
事实上,您可以创建一个具有可为空列的唯一聚集索引,只需尝试一下:
USE tempdb;
CREATE TABLE dbo.[User]
(
Email nvarchar(50) NOT NULL,
PersonID int NULL
);
CREATE UNIQUE CLUSTERED INDEX [IX_User_Email_PersonID]
ON dbo.[User]
(
Email,
PersonID
);
命令已成功完成。
你没有提到你到底想达到什么目的,所以让我猜一猜。 我认为您想实现 Email 和 PersonID 的组合必须是唯一的,除了 PersonID 为 null 的行。
在这种情况下,使用聚集索引没有用,但可以使用过滤的非聚集索引:
USE tempdb;
-- Create the test table
CREATE TABLE dbo.[User]
(
Email nvarchar(50) NOT NULL,
PersonID int NULL
);
-- Create a filtered unique index
CREATE UNIQUE NONCLUSTERED INDEX [IX_User_Email_PersonID]
ON dbo.[User]
(
Email,
PersonID
)
WHERE PersonID IS NOT NULL;
-- Insert test data
INSERT INTO dbo.[User]
(
Email,
PersonId
)
VALUES
( N'a@mydomain.com', 1 ),
( N'b@mydomain.com', 2 ),
( N'b@mydomain.com', 3 ),
( N'c@mydomain.com', 3 ),
( N'c@mydomain.com', 4 ),
( N'd@mydomain.com', NULL ),
( N'e@mydomain.com', NULL ),
( N'f@mydomain.com', NULL );
测试是否可以插入哪些数据:
-- Works
INSERT INTO dbo.[User] ( Email, PersonId )
VALUES ( N'c@mydomain.com', 5 );
-- Fails
INSERT INTO dbo.[User] ( Email, PersonId )
VALUES ( N'c@mydomain.com', 5 );
-- Works
INSERT INTO dbo.[User] ( Email, PersonId )
VALUES ( N'f@mydomain.com', NULL );
-- Works
INSERT INTO dbo.[User] ( Email, PersonId )
VALUES ( N'f@mydomain.com', NULL );
逐步执行后表格内容:
| Email | PersonID |
| ----------------- | -------- |
| a@mydomain.com | 1 |
| b@mydomain.com | 2 |
| b@mydomain.com | 3 |
| c@mydomain.com | 3 |
| c@mydomain.com | 4 |
| d@mydomain.com | NULL |
| e@mydomain.com | NULL |
| f@mydomain.com | NULL |
| c@mydomain.com | 5 |
| f@mydomain.com | NULL |
| f@mydomain.com | NULL |
希望有帮助!
如果这篇文章回答了您的问题,请标记为答案,谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.