Уникальное ограничение T-SQL, ГДЕ AnotherColumn = ParticularValue - PullRequest
0 голосов
/ 04 ноября 2010

Рассмотрим таблицу ссылок со следующими столбцами:

PersonID int NOT NULL
LocationID int NOT NULL
Active bit NOT NULL
...

Система позволяет каждому человеку и местоположению настраиваться независимо.После настройки каждый человек может быть связан не более чем с одним местоположением.Если человек перемещается в новое местоположение, ссылка должна быть деактивирована, а не удалена, чтобы система знала, когда человек последний раз был связан с конкретным местоположением.Человек может иметь любое количество неактивных ссылок, но не более одной активной ссылки.Местоположение может иметь любое количество людей, активно связанных с ним.

Как добавить ограничение в эту таблицу, чтобы предотвратить создание второй активной ссылки для человека, когда она уже существует?

Edit: я думал, что это была коробка 2008 года ... получается, что это 2005, поэтому отфильтрованные индексы не будут работать.

Ответы [ 4 ]

3 голосов
/ 10 ноября 2010

Использование индексированного представления для реализации «отфильтрованного индекса» в версиях SQL Server, выпущенных до 2008 года:

CREATE VIEW vOnlyOneActive
AS
  SELECT PersonID
  FROM <underlying table>
  WHERE Active = 1
GO
CREATE UNIQUE CLUSTERED INDEX IX_vOnlyOneActive on vOnlyOneActive (PersonID)
GO

Вам необходимо иметь правильные настройки ANSI дляэто.

3 голосов
/ 04 ноября 2010

Вместо таблицы связывания используйте ссылку на ID местоположения в таблице Person, как предлагает SilverSkin.Теперь, если вы хотите список неактивных, добавьте триггер в таблицу Person для вставки в таблицу истории (модификацию таблицы ссылок) каждый раз, когда меняется местоположение (<> последняя запись таблицы истории / одна не существуетдля человека).Ссылка в таблице Person дает активную ссылку, в то время как таблица истории дает историю и (если пользователь пинг-понг между местоположениями) указывает на историю местоположений, а не список неактивных.

2 голосов
/ 04 ноября 2010

Ограничения не работают в нескольких строках, поэтому вам потребуется триггер INSERT / UPDATE для принудительного применения только одной активной записи для группы записей с одинаковыми PersonID и LocationID.

0 голосов
/ 04 ноября 2010

ссылки на внешние ключи от tblPerson к PersonID, от tblLocation до LocationID и объединенный ключ на PersonId и LocationId, чтобы убедиться, что они уникальны вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...