Это зависит от вашей СУБД (которую вы не указали), но в некотором смысле вы правы: ограничение внешнего ключа является частным случаем ограничения проверки. Существуют СУБД, которые не позволят вам сформулировать ограничение внешнего ключа в качестве контрольного ограничения.
Основной целью контрольного ограничения является описание условий, которые применяются к одной строке в таблице. Например, у меня есть таблица элементов (как в Hydrogen, Helium, ...), а символы для элементов ограничены, чтобы начинаться с буквы верхнего регистра, а за ним следует ноль, одна или две строчные буквы (две строчные буквы для еще неоткрытых, но предсказанных элементов: Uus - ununseptium (117) , который только что был изолирован, но еще не назван). Это может быть предметом проверочного ограничения:
CHECK(Symbol MATCHES "[A-Z][a-z]{0,2}")
предполагающих МАТЧИ существуют и поддерживают соответствующий язык регулярных выражений.
Вы также можете иметь проверочные ограничения, которые сравнивают значения:
CHECK(OrderDate <= ShipDate OR ShipDate IS NULL)
Чтобы выразить ограничение внешнего ключа в качестве проверочного ограничения, вы должны быть разрешены для выполнения запроса в предложении CHECK. Гипотетически:
CHECK(EXISTS(SELECT * FROM SomeTable AS s
WHERE ThisTable.pk_col1 = s.pk_col1 AND
ThisTable.pk_col2 = s.pk_col2))
В этом примере показаны некоторые проблемы. У меня нет удобного псевдонима таблицы для таблицы, в которой я пишу ограничение проверки - я предположил, что это «ThisTable». Конструкция многословная. Предполагая, что первичный ключ SomeTable объявлен на колонках pk_col1
и pk_col2
, то FOREIGN KEY положение является гораздо более компактным:
FOREIGN KEY (pk_col1, pk_col2) REFERENCES SomeTable
Или, если вы ссылаетесь альтернативный ключ, а не первичный ключ:
FOREIGN KEY (pk_col1, pk_col2) REFERENCES SomeTable(ak_col1, ak_col2)
Это условно более компактно - так что у него меньше шансов получить его неправильно - и он может быть специально обработан сервером, потому что специальная нотация означает, что он знает, что он имеет дело с ограничением внешнего ключа, тогда как общая контрольная оговорка должен быть тщательно изучен, чтобы убедиться, что он соответствует одной из многих возможных форм, которые re эквивалентно внешнему ключу.
Вопрос задает вопрос: когда использовать ограничение проверки и когда использовать ограничение внешнего ключа?
- Используйте ограничение CHECK, чтобы указать критерии, которые можно проверить в одной строке.
- Используйте ограничение FOREIGN KEY, чтобы указать, что значения в текущей строке должны соответствовать значениям строки в другом уникальном ключе (ключ-кандидат, обычно первичный ключ, а не альтернативный ключ) некоторой таблицы, что может быть той же таблицей или (чаще) другой таблицей.
Существует в другой таблице ... или той же таблице. –
Ограничения CHECK определяют ..., которые не основаны на данных в другом столбце. Не совсем корректно, ограничения проверки могут включать несколько столбцов (по крайней мере, в 10g). Лучше сказать «не на основе данных в другой таблице». – Juraj