SQL-ограничения применяются к каждой строке таблицы. Вы не можете сделать их условными на основании определенных значений данных.
Однако, если вы могли бы использовать NULL
вместо нуля, вы можете обойти уникальное ограничение. Уникальное ограничение допускает несколько записей, которые имеют NULL
. Причина в том, что уникальность означает, что не может существовать два равных значения . Равенство означает, что value1 = value2
должно быть правдой. Но в SQL NULL = NULL
равно неизвестно , не соответствует действительности.
CREATE TABLE MyTable (id SERIAL PRIMARY KEY, userid INT, data VARCHAR(64));
INSERT INTO MyTable (userid, data) VALUES ( 1, 'foo');
INSERT INTO MyTable (userid, data) VALUES ( 1, 'bar');
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz');
Пока все хорошо, теперь вы можете подумать, что следующие утверждения нарушат уникальное ограничение, но они этого не делают:
INSERT INTO MyTable (userid, data) VALUES ( 1, 'baz');
INSERT INTO MyTable (userid, data) VALUES (NULL, 'foo');
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz');
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz');