Иногда кажется, что SQL — это набор классических правил с жёсткой логикой, но вот приходит тема NULL, и оказывается, что ничего жёстко не работает. В этой статье мы разберёмся, почему SQL расценивает NULL весьма необычным образом (и ломает нам «обычную» логику уникальности). Будем опираться на опыт и примеры из поста “SQL nulls are weird”, где автор подробно рассказывает, как базы SQLite, Postgres и MySQL ведут себя, когда дело доходит до NULL. Если мы создаём таблицу вида: CREATE TABLE sample (
id TEXT primary key,
email TEXT,
deleted_at TEXT,
UNIQUE(email, deleted_at)
); и вставляем две строки: INSERT INTO sample (id, email, deleted_at)
VALUES ('1', 'ray@mail.com', null);
INSERT INTO sample (id, email, deleted_at)
VALUES ('2', 'ray@mail.com', null); — может казаться, что нарушается принцип «уникальности»: 'ray@mail.com' + null вставились дважды. Но никаких ошибок не будет: SQL предполагает, что (ray@mail.com, NULL) и (ray@mail.com, NULL) — это разные комбин