Как я могу установить ограничение уникальности в MySQL для столбцов, которые могут быть нулевыми? - PullRequest
3 голосов
/ 23 марта 2010

Я знаю, что в MySQL ограничения UNIQUE не обрабатывают значения NULL как равные. Так что, если у меня есть уникальное ограничение на ColumnX, то две отдельные строки могут иметь значения NULL для ColumnX, и это не будет нарушать ограничение. Как я могу обойти это? Я не могу просто установить значение в произвольную константу, которую могу пометить, потому что ColumnX в моем случае на самом деле является внешним ключом для другой таблицы. Какие у меня есть варианты?

Обратите внимание, что в этой таблице также есть столбец "id", который является ее первичным ключом. Поскольку я использую Ruby on Rails, важно сохранить этот столбец id в качестве первичного ключа.

Примечание 2: На самом деле мой уникальный ключ охватывает много столбцов, и некоторые из них должны быть нулевыми, поскольку они являются внешними ключами, и только один из них должен быть ненулевым. На самом деле я пытаюсь «симулировать» полиморфные отношения таким образом, чтобы сохранить ссылочную целостность в БД, но используя технику, описанную в первом варианте принятого решения для вопроса, задаваемого здесь: Почему можно у вас нет внешнего ключа в полиморфной ассоциации?

1 Ответ

1 голос
/ 23 марта 2010

Если только один из внешних ключей может быть ненулевым, то, возможно, было бы лучше реструктурировать вашу таблицу.Вместо colA | colB | colC с одним FK и двумя NULL вместо fkType | fkId.

fkType будет перечисление с опциями, A,B,C, соответствующее вашим внешним таблицам.fkId будет идентификатором во внешней таблице.Теперь вы можете установить ограничение уникальности на (fkType,fkId).

Так что раньше вы могли иметь:

1    | NULL | NULL
NULL | 3    | NULL

Теперь у вас будет:

A | 1
B | 3
...