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

时间:2019-01-18 09:58:32

标签: sql sql-server constraints unique-constraint check-constraints

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

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

仅当Active = 1时,我才希望拥有唯一的(名字,姓氏)学生。如果他们是不活动的,则不应触发唯一性约束。有想法吗?

2 个答案:

答案 0 :(得分: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;

但是,我强烈建议不要使用名称是唯一的想法。我(个人)在我青年时代的几个地方与另一个人分享了我的名字和出生日期,而那些将名字(和出生日期)视为他们系统中唯一的公司对我们俩都是如此头痛(确实有我(或他们)无法使用缩写名称注册的地方,因为我们“已经存在”。

答案 1 :(得分:3)

创建过滤后的唯一索引:

CREATE UNIQUE INDEX UNI_Student_FirstName_LastName ON Student (FirstName, LastName)
WHERE Active = 1