Обычный
UNIQUE в SQL пропускает несколько NULL, потому что NULL не считается равным другому. Из-за этого ограничение часто формально есть, а правило на самом деле не соблюдается:UNIQUE (telegram_id)
Если колонка опциональная, но по смыслу значение всё равно должно быть уникальным, стандартный
UNIQUE даёт дыру в данных.UNIQUE NULLS NOT DISTINCT (telegram_id)
Эта форма говорит PostgreSQL считать
NULL обычным сравнимым значением именно для проверки уникальности.То есть второй
NULL уже не пройдёт, как и дубликат обычного значения.UNIQUE NULLS NOT DISTINCT (tenant_id, external_id)
Особенно полезно для
nullable внешних идентификаторов, one-to-one связей, интеграционных ключей и любых полей, где NULL тоже должен быть единственным допустимым состоянием.🔥
UNIQUE NULLS NOT DISTINCT закрывает один из источников грязных данных и заменяет триггеры.➡️ SQL Ready | #совет
