Как создать ограничение для условных уникальных значений? - PullRequest
0 голосов
/ 18 января 2019

Я использую SQL Server. У меня есть эта таблица:

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

Я хочу, чтобы уникальные (FirstName, LastName) ученики были только в том случае, если Active = 1. Если они неактивны, ограничение уникальности не должно срабатывать. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы не можете создать 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;

Однако я настоятельно рекомендую против мысли, что имена уникальны. Я (лично) поделился своим именем и датой рождения с другим человеком в нескольких местах моей юности, и компании, которые рассматривали имена (и дату рождения) как уникальные в своих системах, были такой головной болью для нас обоих (там действительно были места, где я (или они) не могли зарегистрироваться без использования сокращенного имени, потому что мы «уже существовали»).

0 голосов
/ 18 января 2019

Создать отфильтрованный уникальный индекс:

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