В чём разница между NOT NULL и UNIQUE? Что значит "not null"?
Только начал разбираться с созданием таблиц и путаюсь в двух ограничениях. NOT NULL и UNIQUE — это же про одно и то же, чтобы поле было «нормальным»? Или нет? Что вообще означает «not null» простыми словами и можно ли вешать оба ограничения на один столбец?
2 ответа
Это разные вещи, которые легко спутать, но отвечают они за совершенно разное.
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 — про «не повторяется ли значение».
Если хочется, чтобы и NULL не повторялся (то есть пустое значение допускалось максимум один раз), то поведение зависит от СУБД. В PostgreSQL с версии 15 можно явно написать:
UNIQUE NULLS NOT DISTINCT
и тогда два NULL будут считаться дубликатом. В старых версиях и в MySQL такого нет — несколько NULL всегда проходят. Так что если логика на этом завязана, проверяйте версию и диалект, а не полагайтесь на «должно же работать одинаково».