【问题标题】:How to create a constraint for conditional unique values?如何为条件唯一值创建约束?
【发布时间】:2019-06-12 13:44:28
【问题描述】:

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

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

仅当 Active = 1 时,我才希望有唯一(FirstName,LastName)学生。如果他们处于非活动状态,则不应触发唯一约束。有什么想法吗?

【问题讨论】:

  • 这是个坏主意。如果重复的用户再次活跃怎么办?同音字呢?
  • @Cid 这只是一个例子,让真正的问题保持简单。

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


【解决方案1】:

您不能为此创建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;

但是,我强烈建议不要认为名称是唯一的。我(个人)在我年轻时的几个地方与另一个人分享了我的姓名和出生日期,在他们的系统中将姓名(和出生日期)视为唯一的企业对我们俩来说都是如此头痛(真的有我(或他们)在不使用缩写名称的情况下无法注册的地方,因为我们“已经存在”)。

【讨论】:

  • 完美解决方案,谢谢。我同意名称不能是唯一的,但这只是帮助我解决实际问题的简化示例。
【解决方案2】:

创建过滤的唯一索引:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2021-07-22
    • 2017-07-07
    相关资源
    最近更新 更多