Ограничения NOT NULL и CHECK
Запрещайте отсутствующие значения с помощью NOT NULL и проверяйте правила предметной области с помощью CHECK (price > 0, status IN ('active','archived'))
«Ограничения NOT NULL и CHECK» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Зачем нужны ограничения?
Ограничения переносят проверку корректности в базу данных. Преимущество огромно: каждое приложение, скрипт и произвольный запрос записывают корректные данные — или явно завершаются ошибкой.
NOT NULL
Самое простое ограничение: этот столбец должен иметь значение:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL,
age INT -- NULL allowed
);Добавление NOT NULL позже
Сначала заполните пропущенные значения, затем добавьте ограничение:
UPDATE users SET email = 'unknown@example.com' WHERE email IS NULL;
ALTER TABLE users ALTER COLUMN email SET NOT NULL;Ограничение CHECK
Произвольное логическое выражение, которому должна соответствовать каждая строка:
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
price NUMERIC(10,2) NOT NULL CHECK (price > 0),
discount NUMERIC(5,2) DEFAULT 0 CHECK (discount BETWEEN 0 AND 100)
);CHECK со значениями наподобие перечисления
Ограничить столбец фиксированным набором значений:
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
status TEXT NOT NULL
CHECK (status IN ('pending','paid','shipped','cancelled'))
);NULL незаметно проходит CHECK
Ограничение CHECK считается выполненным, когда выражение равно NULL (неизвестно). Если нужна строгая гарантия, объедините его с NOT NULL:
CREATE TABLE invoices (
amount NUMERIC(10,2) NOT NULL CHECK (amount > 0)
);CHECK для нескольких столбцов
Можно ссылаться на несколько столбцов:
CREATE TABLE bookings (
start_at TIMESTAMPTZ NOT NULL,
end_at TIMESTAMPTZ NOT NULL,
CHECK (start_at < end_at)
);Добавление CHECK позже
Сначала проверьте существующие строки, затем добавьте ограничение:
ALTER TABLE products
ADD CONSTRAINT positive_price CHECK (price > 0);
-- fails if any row violates itПриём с NOT VALID для больших таблиц
Пропустите предварительное полное сканирование и выполните проверку позже в фоновом режиме:
ALTER TABLE products
ADD CONSTRAINT positive_price CHECK (price > 0) NOT VALID;
ALTER TABLE products VALIDATE CONSTRAINT positive_price;Именованные ограничения
Всегда называйте ограничения, чтобы сообщения об ошибках и миграции были предсказуемыми:
ALTER TABLE products
ADD CONSTRAINT products_price_positive CHECK (price > 0);Не дублируйте логику в приложении
Если база данных обеспечивает это ограничение, выигрывает каждый путь выполнения — больше не будет ситуации «я забыл проверить». Сохраняйте дублирующую проверку в приложении для удобства пользователя (мгновенная обратная связь), но источником истины должна быть база данных.
Итоги
NOT NULL и CHECK блокируют наиболее распространённые некорректные данные.
- NOT NULL: пропущенные значения запрещены
- CHECK: произвольные правила для каждой строки
- Используйте NOT VALID + VALIDATE для добавления ограничений без остановки работы
Быстрая проверка
Что произойдёт, если задать CHECK (price > 0) для столбца без NOT NULL?
Часто задаваемые вопросы
Урок «Ограничения NOT NULL и CHECK» бесплатный?
Да — полный текст урока «Ограничения NOT NULL и CHECK» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Ограничения NOT NULL и CHECK»?
Запрещайте отсутствующие значения с помощью NOT NULL и проверяйте правила предметной области с помощью CHECK (price > 0, status IN ('active','archived')) Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Ограничения NOT NULL и CHECK»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Ограничения NOT NULL и CHECK
- Ограничения UNIQUE и составные ключи
- FOREIGN KEY и ссылочные действия
- Значения DEFAULT и генерируемые столбцы