Нужно ли указывать NOT NULL в столбце с контрольным ограничением?

#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, но именно так определены ограничения проверки для работы.