TGViewer
Python Portal Python Portal @pythonportal · 50.3K subscribers
Post #6109 4.67K
Проверка уникальности работает через =, а 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;


👉 @PythonPortal
  • 👍 7
  • ❤ 1
More from @pythonportal
  1. Oct 3, 2026«Как обучить нейросеть» — краткий конспект лекций курса MIT по глубокому обучению за 2024…
  2. Oct 3, 2026Tencent выпустила новую модель для перевода, которая, по их словам, обходит Google Transla…
  3. Oct 2, 2026Один из лучших ресурсов по производительности SQL: use-the-index-luke.com 👉 @PythonPortal
  4. Oct 2, 2026Многие постоянно путаются в этом: В чём на самом деле разница между 100 МБ/с и 100 Мбит/с?…
  5. Oct 1, 2026Исследователи MIT математически доказали, что ChatGPT устроен так, что может затягивать по…
  6. Oct 1, 2026Интервьюер: Ты вводишь имя пользователя в Gmail, и через несколько секунд система пишет: «…
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 →