#sql #sql-server
#sql #sql-server
Вопрос:
doctorName VARCHAR(50) CHECK(LEN(doctorName ) > 0)
Должен ли я указывать NOT NULL в предыдущем объявлении?
Значение NULL не будет разрешено, поскольку оно не пройдет КОНТРОЛЬНОЕ ограничение… Итак, какова цель указания NOT NULL при таких обстоятельствах?
Ответ №1:
Вам либо нужно указать NOT NULL
:
doctorName VARCHAR(50) NOT NULL CHECK(LEN(doctorName ))
Или проверьте ограничение:
doctorName VARCHAR(50) CHECK(LEN(doctorName ) > 0 AND doctorName IS NOT NULL)
Первый предпочтительнее, потому что NOT NULL
встроен в SQL, поэтому оптимизатор может воспользоваться его преимуществами.
Почему это необходимо? Если имя равно NULL
, то сравнение возвращает NULL
. CHECK
ограничения работают иначе, чем WHERE
предложения и CASE
выражения. CHECK
Ограничение не выполняется только тогда, когда выражение принимает значение FALSE. Итак, оба значения TRUE и NULL
удовлетворяют ограничению. С другой стороны, WHERE
предложения и CASE
выражения обрабатываются NULL
как FALSE, а не как TRUE.
Вот пример db<>fiddle, показывающий, что NULL
значения не перехватываются check
ограничением.
Комментарии:
1. Гордон, ты можешь добавить какую-либо ссылку на «Контрольное ограничение не выполняется только тогда, когда выражение принимает значение FALSE»?
2. Вы правы. Я проверил это в Oracle, PostgreSQL, DB2, SQL Server и MariaDB. MySQL не применяет его, поскольку в любом случае игнорирует ограничения ПРОВЕРКИ. 1
3. @TheImpaler . . . На самом деле я не могу найти ссылку в документации Microsoft, но именно так определены ограничения проверки для работы.