Ты добавил условие
CHECK (salary > 0), чтобы в базу не попадали кривые зарплаты. Но вдруг обнаруживаешь там пустые значения. Как так вышло?⚙️ Трехзначная логика (3VL)
В SQL кроме
TRUE и FALSE есть состояние UNKNOWN (неизвестно). Если сравнить пустоту с нулем (NULL > 0), результат будет не ложь, а именно неизвестность. И механизмы базы реагируют на это по-разному.🛡️ Двойные стандарты SQL
🔹 Фильтр WHERE — строгий охранник. Он возвращает строку, только если условие дало
TRUE. Состояние UNKNOWN он воспринимает как FALSE и скрывает запись.🔸 Валидация CHECK — ленивый вахтер. Она отклоняет запись, только если условие дало
FALSE. Если результат UNKNOWN, ограничение пожимает плечами и пропускает значение в таблицу.CREATE TABLE emp (
salary INT CHECK (salary > 0)
);
-- Запишется без ошибок!
INSERT INTO emp (salary) VALUES (NULL);
🚀 Решение проблемы
Одного
CHECK бывает мало. Если поле не должно содержать пустоту, всегда страхуй его правилом NOT NULL.💡 Ограничения базы строго судят неверные данные, но пасуют перед неизвестностью.



