Что такое constraints (CHECK, UNIQUE, NOT NULL) в PostgreSQL?

JuniorPostgreSQL · Backend·Обновлено 16 сентября 2026
Коротко
Constraints — это правила целостности данных, которые PostgreSQL проверяет при вставке и обновлении строк: NOT NULL запрещает пустые значения, UNIQUE гарантирует отсутствие дублей, а CHECK проверяет произвольное логическое условие для значения столбца.

Что такое constraints

Constraints (ограничения целостности) — это правила, которые база данных применяет к столбцам или таблицам, чтобы данные всегда оставались корректными. Если операция INSERT или UPDATE нарушает ограничение, PostgreSQL откатывает её и возвращает ошибку. Это защита данных на уровне СУБД, а не приложения — она работает всегда, независимо от того, из какого сервиса пришёл запрос.

NOT NULL

Запрещает хранить NULL в столбце. Полезно для полей, которые обязательно должны иметь значение, например email или id.

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email TEXT NOT NULL
);

Попытка вставить строку без email завершится ошибкой null value in column "email" violates not-null constraint.

UNIQUE

Гарантирует, что значения в столбце (или комбинации столбцов) не повторяются среди всех строк таблицы. Под капотом PostgreSQL создаёт уникальный индекс, поэтому UNIQUE ещё и ускоряет поиск по этому столбцу.

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email TEXT UNIQUE
);

Важный нюанс: NULL не считается равным другому NULL, поэтому UNIQUE-столбец может содержать сколько угодно строк со значением NULL.

CHECK

Проверяет произвольное булево выражение для значения строки. Позволяет задать бизнес-правило прямо в схеме БД.

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    price NUMERIC CHECK (price > 0),
    discount NUMERIC CHECK (discount >= 0 AND discount <= 100)
);

CHECK может ссылаться на несколько столбцов одной строки, например CHECK (end_date > start_date).

Именование ограничений

Ограничениям можно (и рекомендуется) давать явные имена — это упрощает диагностику ошибок и последующее изменение через ALTER TABLE:

ALTER TABLE products
    ADD CONSTRAINT price_positive CHECK (price > 0);

Как ведут себя constraints

  • Проверяются на каждой вставке и обновлении затронутого столбца.
  • При нарушении транзакция (или конкретная операция) откатывается с понятной ошибкой.
  • UNIQUE и PRIMARY KEY реализованы через индексы, поэтому они не только проверяют данные, но и ускоряют выборки и JOIN по этим столбцам.
  • Можно комбинировать несколько constraints на одном столбце: email TEXT NOT NULL UNIQUE.

Зачем это нужно на практике

Constraints переносят часть валидации из кода приложения в БД. Даже если в приложении есть баг или прямой доступ к базе выполняет другой сервис, некорректные данные просто не попадут в таблицу. Это особенно важно в системах, где с одной базой работает несколько независимых сервисов.

Что хочет услышать интервьюер

Кандидат понимает, что constraints — это ограничения целостности на уровне БД, а не приложения

Может объяснить разницу между NOT NULL, UNIQUE и CHECK своими словами

Знает, что UNIQUE реализуется через индекс и допускает несколько NULL

Приводит пример синтаксиса CREATE TABLE или ALTER TABLE с constraint

Понимает, что нарушение constraint приводит к ошибке и откату операции

Пример: Таблица с NOT NULL, UNIQUE и CHECK

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email TEXT NOT NULL UNIQUE,
    age INTEGER CHECK (age >= 0)
);

-- добавление именованного ограничения к существующей таблице
ALTER TABLE users
    ADD CONSTRAINT age_reasonable CHECK (age < 150);

Типичные ошибки

Считают, что UNIQUE запрещает более одного NULL в столбце

Путают CHECK с триггерами или валидацией только на уровне приложения

Забывают, что PRIMARY KEY — это фактически NOT NULL + UNIQUE вместе

Не знают, что constraints можно добавлять и удалять через ALTER TABLE после создания таблицы

Не упоминают, что UNIQUE и PRIMARY KEY создают индекс и влияют на производительность

Лучшие курсы по теме

изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажерыAI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Node.js с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Nest.js с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее