← Все вопросы

В чём разница между NOT NULL и UNIQUE? Что значит "not null"?

Задан 15 дней назад299 просмотров2 ответа
1

Только начал разбираться с созданием таблиц и путаюсь в двух ограничениях. NOT NULL и UNIQUE — это же про одно и то же, чтобы поле было «нормальным»? Или нет? Что вообще означает «not null» простыми словами и можно ли вешать оба ограничения на один столбец?

2 ответа

8
✓ Принятый ответ — помог автору

Это разные вещи, которые легко спутать, но отвечают они за совершенно разное.

NOT NULL — «значение обязано быть». NULL в SQL — это не ноль и не пустая строка, а отсутствие значения вообще. Ограничение NOT NULL запрещает оставлять ячейку пустой: при вставке вы обязаны что-то указать.

UNIQUE — «значение не должно повторяться». Оно следит, чтобы в столбце не было двух одинаковых значений. Но есть нюанс: UNIQUE разрешает NULL, причём в большинстве СУБД (PostgreSQL, MySQL, SQLite) — даже несколько NULL, потому что один NULL формально не равен другому NULL.

Пример:

CREATE TABLE accounts (
    id       SERIAL PRIMARY KEY,
    email    VARCHAR(255) NOT NULL UNIQUE,  -- обязателен И уникален
    phone    VARCHAR(20) UNIQUE             -- уникален, но можно не указывать
);

Что это даёт:

  • email нельзя пропустить (NOT NULL) и нельзя продублировать (UNIQUE).
  • phone можно оставить пустым у нескольких пользователей, но если указан — должен быть уникальным.

Да, оба ограничения можно и нужно ставить вместе, когда поле и обязательно, и уникально (как раз случай email).

Полезно знать: под UNIQUE СУБД автоматически создаёт индекс, поэтому поиск по такому полю работает быстро — это приятный бонус. NOT NULL же индекса не создаёт, это просто проверка при записи.

Короткая шпаргалка: NOT NULL — про «есть ли значение», UNIQUE — про «не повторяется ли значение».

0

Если хочется, чтобы и NULL не повторялся (то есть пустое значение допускалось максимум один раз), то поведение зависит от СУБД. В PostgreSQL с версии 15 можно явно написать:

UNIQUE NULLS NOT DISTINCT

и тогда два NULL будут считаться дубликатом. В старых версиях и в MySQL такого нет — несколько NULL всегда проходят. Так что если логика на этом завязана, проверяйте версию и диалект, а не полагайтесь на «должно же работать одинаково».

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект