УНИКАЛЬНОЕ ограничение, контролируемое битовым столбцом - PullRequest
6 голосов
/ 22 октября 2010

У меня есть таблица, что-то вроде

FieldsOnForms(
 FieldID int (FK_Fields)
 FormID int (FK_Forms)
 isDeleted bit
)

Пара (FieldID, FormID) должна быть уникальной, НО только если строка не удалена (isDeleted = 0).

Можно ли определить такое ограничение в SQLServer 2008? (без использования триггеров)

P.S. Установка уникальности (FieldID, FormID, isDeleted) добавляет возможность пометить одну строку как удаленную, но я хотел бы иметь возможность установить n строк (для FieldID, FormID) в isDeleted = 1 и иметь только одну isDeleted = 0

Ответы [ 3 ]

13 голосов
/ 22 октября 2010

Вы можете иметь уникальный индекс , используя функцию фильтрованных индексов SQL Server 2008 , или вы можете применить УНИКАЛЬНЫЙ индекс к представлению (отфильтрованный индекс бедняка, работает против ранее версии), но у вас не может быть УНИКАЛЬНОГО ограничения, такого как вы описали.

Пример отфильтрованного индекса:

 CREATE UNIQUE NONCLUSTERED INDEX IX_FieldsOnForms_NonDeletedUnique ON FieldsOnForms (FieldID,FormID) WHERE isDeleted=0
4 голосов
/ 22 октября 2010

Вы можете изменить столбец IsDeleted на DeletedDate и сделать его DATETIME с точным временем, когда строка была логически удалена.Кроме того, вы можете добавить столбец DeletedDate, а затем создать вычисляемый столбец IsDeleted для этого, чтобы этот столбец оставался доступным, если он используется в коде.Затем вы, конечно, поместите уникальный индекс поверх DeletedDate (в дополнение к FieldID и FormId) вместо столбца IsDeleted.Это позволило бы использовать только один столбец NULL.

Альбин опубликовал решение, подобное этому, но затем удалил его.Я не уверен, почему, но если он переиздаст это, тогда он был здесь раньше моего.:)

0 голосов
/ 22 октября 2010

Нет, уникальные средства действительно уникальны. Вам нужно будет либо переместить удаленные записи в другую таблицу, либо заменить IsDeleted на что-то, что может быть уникальным для всех удаленных записей (например, отметка времени). Любое решение потребует дополнительной работы либо в вашем приложении, либо в хранимой процедуре, либо в триггере.

...