NULL в уникальных ключах
Согласно стандарту SQL-99 Firebird допускает одно или более значений NULL
в столбце на который наложено ограничение UNIQUE
.Это позволяет определить ограничение UNIQUE
на столбцах, которые не имеют ограничения NOT NULL
.
Для уникальных ключей, содержащих несколько столбцов, логика немного сложнее:
-
Разрешено множество записей со значением NULL во всех столбцах ключа;
-
Разрешено множество записей с различными комбинациями null и not-null значений в ключах;
-
Разрешено множество записей, в которых в одном из столбцов уникального ключа содержится значение NULL, а остальные столбцы заполнены значениями и эти значения различны хотя бы в одном из них;
-
Разрешено множество записей, в которых в одном из столбцов уникального ключа содержится значение NULL, а остальные столбцы заполнены значениями, и эти значения имеют совпадения хотя бы в одном из них.
Это можно резюмировать следующим примером:
RECREATE TABLE t( x int, y int, z int, unique(x,y,z));
INSERT INTO t values( NULL, 1, 1 );
INSERT INTO t values( NULL, NULL, 1 );
INSERT INTO t values( NULL, NULL, NULL );
INSERT INTO t values( NULL, NULL, NULL ); -- Разрешено
INSERT INTO t values( NULL, NULL, 1 ); -- Запрещено