Введение

Тип ограничения целостности в SQL. Контрольное ограничение — это тип ограничения целостности в SQL, который задает требование, которому должна удовлетворять каждая строка в таблице базы данных. Ограничение должно быть представлено предикатом. Предикат может относиться к одному или нескольким столбцам таблицы. Результат предиката может быть TRUE, FALSE или UNKNOWN в зависимости от наличия значений NULL. Если предикат вычисляется как UNKNOWN, то ограничение не нарушается, и строку можно вставить или обновить в таблице. Это отличается от предикатов в предложениях WHERE в операторах SELECT или UPDATE. Например, в таблице, содержащей информацию о продуктах, можно добавить контрольное ограничение, чтобы цена и количество продукта были неотрицательными:

цена >= 0

количество >= 0

Если бы эти ограничения отсутствовали, было бы возможно иметь отрицательную цену (например, -30 долларов) или отрицательное количество (например, -3 единицы). Контрольные ограничения используются для обеспечения корректности данных в базе данных и поддержания целостности данных. Если они реализованы на уровне базы данных, приложения, использующие эту базу данных, не смогут добавлять некорректные данные или изменять корректные данные таким образом, чтобы они стали некорректными, даже если само приложение допускает ввод некорректных данных.

Общие ограничения

Большинство систем управления базами данных ограничивают ограничения проверки одной строкой, предоставляя доступ к константам и детерминированным функциям, но не к данным в других таблицах или к данным, невидимым для текущей транзакции из-за уровня изоляции транзакций. Такие ограничения фактически являются не ограничениями проверки таблицы, а ограничениями проверки строки. Поскольку эти ограничения обычно проверяются только при прямом обновлении строки (в целях производительности) и часто реализуются как неявные триггеры INSERT или UPDATE, ограничения целостности могли бы быть нарушены косвенными действиями, если бы не эти ограничения. Более того, в противном случае, ограничение CHECK заблокировало бы вполне допустимые изменения в этих записях. Примеры опасных ограничений включают:

Пользовательские триггеры могут быть использованы для обхода этих ограничений. Хотя их реализация схожа, семантически понятно, что триггеры будут срабатывать только при прямом изменении таблицы, и ответственность за обработку косвенных, важных изменений в других таблицах лежит на разработчике; в то время как ограничения, напротив, должны быть "истинными всегда", независимо от действий пользователя или недостатка предвидения разработчика.