Ограничение SQL Проверка уникальных значений - PullRequest
0 голосов
/ 04 мая 2018

У меня есть таблица, и мне нужно ограничить вставленные данные, я уже использую триггер, но мне было интересно, смогу ли я выполнить ту же задачу с ограничением.

Поля:

Id
Date
Passport
...
Deleted

Ограничение должно разрешать n записей, пока поле Удалено равно 1 , но если поле Удалено равно 0 должна быть только одна строка с одинаковыми датой и паспортом.

Должно работать для следующих шагов:

  1. Добавление строки с Id = 1, Дата = 2018-05-01, Паспорт = MPEUIE80, Удалено = 0
  2. Удаление строки с Id = 1, поэтому поле Deleted будет 1
  3. Добавление строки с Id = 2, Дата = 2018-05-01, Паспорт = MPEUIE80, Удалено = 0
  4. Удаление строки с Id = 2, поэтому поле Deleted будет 1
  5. Добавление строки с Id = 3, Дата = 2018-05-01, Паспорт = MPEUIE80, Удалено = 0
  6. Добавление строки с Id = 4, Дата = 2018-05-01, Паспорт = MPEUIE80, Удалено = 0

До пятого шага все работает, но на последнем шаге должна быть ошибка, потому что я не могу обработать две строки с одинаковыми Дата , одинаковыми Паспорт и оба с удалено = 0

Заранее спасибо.

1 Ответ

0 голосов
/ 04 мая 2018

Вы можете использовать отфильтрованный, уникальный индекс:

create table [t](
    [id] [int] NULL,
    [date] [datetime] NULL,
    [passport] [char](8) NULL,
    [deleted] [int] NULL
)

create unique index unq_t_date_passport on t(date, passport)
    where deleted = 0;

EDIT:

Если отфильтрованные индексы не работают в вашей версии SQL Server, вы можете проверить уровень совместимости . Он должен быть доступен всякий раз, когда совместимость установлена ​​на 100 или выше. Вы можете проверить версию своего сервера и уровень совместимости, используя:

SELECT SERVERPROPERTY('ProductVersion');
SELECT name, compatibility_level FROM sys.databases;

Существует еще один метод, который будет работать, начиная с SQL Server 2005, при условии, что идентификатор является уникальным и неотрицательным. Он использует вычисляемый столбец, чтобы делать то же самое, что и отфильтрованный индекс:

alter table t
    add column deleted_id (case when deleted = 0 then -1 else id end) persisted;

create unique index unq_t_passport_date_deleted_id on t(passport, date, deleted_id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...