TGViewer
SQL Portal | Базы Данных SQL Portal | Базы Данных @sqlportal · 13.7K subscribers
Post #2081 1.1K
Проверка уникальности работает через =, а NULL = NULL не даёт true. По умолчанию NULL не считается уникальным значением.

Postgres не может доказать равенство двух NULL, поэтому пропускает обе строки.

Простой пример, где это ломается, — составной ключ:

-- UNIQUE (user_id, org_id, deleted_at)

INSERT INTO memberships VALUES (1, 10, NULL);
INSERT INTO memberships VALUES (1, 10, NULL);

-- обе строки будут вставлены


В итоге можно получить две активные записи membership для одного и того же пользователя, потому что ограничение уникальности вообще не срабатывает.

NULLS NOT DISTINCT

Начиная с Postgres 15, уникальные ограничения и индексы могут считать NULL равными:

UNIQUE NULLS NOT DISTINCT (user_id, org_id, deleted_at)


Второй INSERT уже завершится ошибкой.

Но это также запретит две строки с одинаковым значением deleted_at, а не только две активные строки.

Частичный уникальный индекс

Если уникальность нужно обеспечить только для активных строк, используйте partial unique index:

CREATE UNIQUE INDEX ON memberships (user_id, org_id)
WHERE deleted_at IS NULL;


👉 @SQLPortal
  • ❤ 2
  • 🔥 2
More from @sqlportal
  1. Oct 5, 2026Один из лучших ресурсов по производительности SQL: use-the-index-luke.com 👉 @SQLPortal
  2. Oct 4, 2026Microsoft представила обновления SQL на SQLCon Barcelona 2026 Среди главных направлений —…
  3. Oct 4, 20266 инструментов в закладки бэкенд-разработчику • Hoppscotch — тестирование API и просмотр о…
  4. Oct 3, 2026Post #2122
  5. Oct 3, 2026Вопрос по SQL Посмотрите на запрос: как думаете, какой результат он вернёт и почему? 👉 @S…
  6. Oct 3, 2026В стране 2 000 клиентов. Сколько SQL-запросов этот метод отправит в базу данных? Напишите…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →