ограничить значения ограничением с помощью таблицы поиска - PullRequest
3 голосов
/ 24 февраля 2012

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

Tbl_UserType_value_lookup:

UserTypeID  |AllowedValue
-------------------------
1           |x
1           |y
2           |u
3           |a

(это говорит о том, что пользователь типа 1 может вводить значения только типа x и y, а не типа u или a .. и т. Д.)

У меня есть еще один стол

Tbl_Activity:

UserID   |userTypeID    |value
---------------------------

Теперь в этой таблице как я могу изменить пользователя типа 1 со значениями согласно таблице Tbl_UserType_value_lookup, используя ограничение CHECK?

Есть ли другой способ?

Ответы [ 4 ]

3 голосов
/ 24 февраля 2012

Предполагая, что у вас есть уникальный ключ на Tbl_UserType_value_lookup для UserTypeID, Allowed Value, вы можете иметь составной внешний ключ на Tbl_Activity, который ссылается на эти столбцы.

(т. Е. Комбинация UserType, Value будетдолжны существовать в Tbl_UserType_value_lookup, чтобы их можно было вставлять.

Здесь достаточно много обсуждений:

Создание составного внешнего ключа в SQL Server 2008

0 голосов
/ 24 февраля 2012

Tbl_Activity:

FOREIGN KEY allowed_value(userTypeID, Value) 
    REFERENCES Tbl_UserType_value_lookup (userTypeID, AllowedValue)
    ;

(Если ваша платформа SQL поддерживает составные внешние ключи, в противном случае вам придется взломать некоторые уродливые триггеры и / или использовать суррогатный ключ)

Кстатиизбегайте MixedCase в именах таблиц и столбцов.Обычно SQL не чувствителен к регистру, но если ваша база данных должна быть перемещена в установку с учетом регистра, вы будете плакать горькими слезами.Смешивание MixedCase и under_scores считается Bad_Style (большинством людей).

0 голосов
/ 24 февраля 2012

Я думаю, что вы не можете создать динамическое ограничение CHECK. Используйте внешний ключ для ссылки Tbl_Activity на Tbl_UserType_value_lookup.

То, что вы хотите - это правило приложения, которое не может быть легко реализовано в структуре данных.

0 голосов
/ 24 февраля 2012

Ограничения CHECK обеспечивают целостность домена путем ограничения значений, принимаемых столбцом. Они аналогичны ограничениям FOREIGN KEY в том, что они управляют значениями, помещаемыми в столбец. Разница заключается в том, как они определяют, какие значения являются действительными: ограничения FOREIGN KEY получают список допустимых значений из другой таблицы, а ограничения CHECK определяют действительные значения из логического выражения, которое не основано на данных в другом столбце. Например, диапазон значений для столбца зарплаты может быть ограничен созданием ограничения CHECK, которое допускает только данные в диапазоне от 15 000 до 100 000 долларов США. Это предотвращает ввод заработной платы за пределы обычного диапазона заработной платы.

Используйте ЗАРУБЕЖНЫЕ КЛЮЧИ!


Обновление: Для получения дополнительной информации, проверьте ЗДЕСЬ .

...