簡體   English   中英

Sqlserver如何使用其中一個列創建復合唯一鍵可以為空

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM