如何为条件唯一值创建约束?

Adn*_*and 0 sql sql-server constraints check-constraints unique-constraint

我正在使用SQL Server.我有这张桌子:

CREATE TABLE Student
(
   ID int PRIMARY KEY,
   FirstName varchar(100),
   LastName varchar(100),
   Active bit;
)
Run Code Online (Sandbox Code Playgroud)

我希望只有Active = 1才能拥有唯一(FirstName,LastName)学生.如果它们处于非活动状态,则不应触发唯一约束.任何的想法?

Lar*_*rnu 6

您无法CONSTRAINT为此创建,但是,您可以创建筛选的唯一索引:

USE Sandbox;
GO

CREATE TABLE dbo.Student (ID int IDENTITY(1, 1) PRIMARY KEY,
                          FirstName varchar(100),
                          LastName varchar(100),
                          Active bit);


CREATE UNIQUE INDEX UQ_StudentName
    ON Student (FirstName,LastName)
    WHERE Active = 1;
GO

INSERT INTO dbo.Student (FirstName,
                         LastName,
                         Active)
VALUES ('Jane', 'Smith', 1); --Success
GO
INSERT INTO dbo.Student (FirstName,
                         LastName,
                         Active)
VALUES ('Jane', 'Smith', 0); --Success
GO
INSERT INTO dbo.Student (FirstName,
                         LastName,
                         Active)
VALUES ('Jane', 'Smith', 0); --Success
GO
INSERT INTO dbo.Student (FirstName,
                         LastName,
                         Active)
VALUES ('Jane', 'Smith', 1); --Fails;
GO

UPDATE dbo.Student
SET Active = 1
WHERE ID = 2; --Fails;
GO

SELECT *
FROM dbo.Student;
GO

DROP TABLE dbo.Student;
Run Code Online (Sandbox Code Playgroud)

但是,我强烈建议反对名称是唯一的.我(个人)在我年轻时的几个地方与另一个人分享了我的姓名和出生日期,并且在他们的系统中将姓名(和出生日期)视为独特的对我们两个人来说是一个头疼(确实有因为我们"已经存在"而我没有使用缩写名称而无法注册的地方.