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 к столбцу.