Почему postgres не считает null уникальным значением?

PostgreSQL, как и многие другие системы управления базами данных (СУБД), включает функциональность, которая позволяет определять столбцы с уникальными значениями. Вместе с тем, некоторые люди могут быть удивлены тем, что PostgreSQL позволяет в столбце, имеющем ограничение уникальности, дубликаты значений, включая NULL.

Поведение PostgreSQL в данном случае связано с реализацией стандарта SQL и концепцией уникальности в СУБД. Поле, имеющее столбец с ограничением уникальности, предназначено для однозначной идентификации каждой записи в таблице. В то время как NULL является специальным значением, которое используется для указания отсутствия значения или неизвестного значения. NULL не сравнивается с другими значениями и не может быть равным или неравным им.

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

Это поведение PostgreSQL соответствует стандарту SQL, в котором говорится, что NULL не является равным или неравным какому-либо другому значению, включая сам NULL. Отсутствие NULL как дубликата другого значения также имеет практическую пользу, поскольку это позволяет использовать ограничение уникальности в столбцах, когда возможны значения NULL, без необходимости изменять данные или работать вокруг ограничения.

С другой стороны, если вам требуется, чтобы столбец с ограничением уникальности не принимал значения NULL, можно явно указать это при создании таблицы, добавив ограничение NOT NULL к столбцу.

Например:

CREATE TABLE my_table (
    my_column INTEGER,
    CONSTRAINT unique_column_constraint UNIQUE (my_column)
);

CREATE TABLE my_table (
    my_column INTEGER NOT NULL,
    CONSTRAINT unique_column_constraint UNIQUE (my_column)
);

В первом примере столбец my_column может принимать NULL значения, и PostgreSQL будет считать их не дубликатами других значений. Во втором примере столбец my_column является NOT NULL, и PostgreSQL будет требовать, чтобы столбец содержал ненулевые значения и не будет принимать NULL значения.

В заключение, PostgreSQL не считает NULL уникальным значением из-за спецификации SQL, которая указывает, что NULL не является равным или неравным какому-либо значению, включая сам NULL. Это позволяет использовать ограничения уникальности в столбцах с возможными значениями NULL без изменения данных или работы вокруг ограничений. Если необходимо, чтобы столбец с ограничением уникальности не принимал значения NULL, можно явно указать это при создании таблицы, добавив ограничение NOT NULL к столбцу.