Парадокс 3VL: почему WHERE блокирует NULL, а CHECK — радостно… — SQL Academy: всё о реляционных БД и SQL — TG.ME

🤯 Парадокс 3VL: почему WHERE блокирует NULL, а CHECK — радостно пропускает?

Ты добавил условие 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.

💡 Ограничения базы строго судят неверные данные, но пасуют перед неизвестностью.
👍24❤4🔥4🤯3
July 10, 2026 3.7K 5 13