Это зависит от вашей СУБД (которую вы не указали), но в некотором смысле вы правы: ограничение внешнего ключа является частным случаем ограничения проверки. Существуют СУБД, которые не позволяют сформулировать ограничение внешнего ключа как ограничение проверки.
Основное назначение проверочного ограничения - описать условия, которые применяются к одной строке в таблице. Например, у меня есть таблица элементов (как в Водороде, Гелии, ...), и символы для элементов ограничены, чтобы начаться с заглавной буквы и сопровождаются нулем, одной или двумя строчными буквами ( две строчные буквы для еще не обнаруженных, но предсказанных элементов: Uus - ununseptium (117), который только что был выделен, но еще не назван). Это может быть предметом ограничения CHECK:
CHECK(Symbol MATCHES "[A-Z][a-z]{0,2}")
при условии, что MATCHES существует и поддерживает соответствующий язык регулярных выражений.
Вы также можете иметь проверочные ограничения, которые сравнивают значения:
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)
Это обозначено более компактно - так что меньше шансов ошибиться - и может быть специально обработано сервером, потому что специальная запись означает, что он знает, что имеет дело с ограничением внешнего ключа, тогда как общее условие проверки имеет быть проверенным, чтобы видеть, соответствует ли он одной из многих возможных форм, которые эквивалентны внешнему ключу.
Вопрос задает: когда использовать ограничение проверки, а когда использовать ограничение внешнего ключа?
- Используйте ограничение CHECK, чтобы указать критерии, которые можно проверить в одной строке.
- Используйте ограничение FOREIGN KEY, чтобы указать, что значения в текущей строке должны соответствовать значениям строки в каком-либо другом уникальном ключе (ключ-кандидат, обычно первичный ключ, а не альтернативный ключ) некоторой таблицы - что может быть одной и той же таблицей или (чаще) другой таблицей.