Условный составной ключ в MySQL? - PullRequest
6 голосов
/ 13 января 2010

Итак, у меня есть эта таблица с составным ключом, в основном «userID» - «данные» должны быть уникальными (см. Мой другой вопрос Таблица SQL - полууникальная строка? )

Однако мне было интересно, можно ли было сделать так, чтобы это вступило в силу только тогда, когда userID не равен нулю? Под этим я подразумеваю, что 'userID' - 'data' должен быть уникальным для ненулевых идентификаторов пользователя?

Или я лаю не на том дереве?

Спасибо
Мало

1 Ответ

5 голосов
/ 13 января 2010

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');
...