MySql - как вы можете создать уникальное ограничение на комбинацию двух значений в двух столбцах

У меня проблема с созданием индекса, описанного в ответе на этот вопрос: sql unique ограничение на комбинацию из 2 столбцов

Я использую MySql и получил синтаксическую ошибку, моя версия этого запроса выглядит следующим образом:

CREATE UNIQUE INDEX ON friends (LEAST(userID, friendID), GREATEST(userID, friendID));

Функции LEAST и GREATEST доступны в MySql, но, может быть, синтаксис должен быть другим? Я попытался сделать версию ALTER TABLE, но она тоже не сработала.


person Busiek    schedule 25.11.2014    source источник
comment
почему наименьший и наибольший? поместите уникальный идентификатор пользователя, идентификатор друга, а затем поместите внешний ключ в оба столбца, указав, на какую таблицу/поле они ссылаются.   -  person Marco Mura    schedule 25.11.2014
comment
Вы не можете этого сделать, и точка. индексы находятся в полях, а не в производных значениях.   -  person Marc B    schedule 25.11.2014


Ответы (1)


В MySQL вы не можете использовать функции в качестве значений для индексов.

В документации это прямо не указано, однако основной характеристикой индекса является поддержка только «фиксированных» данных:

Индексы используются для быстрого поиска строк с определенными значениями столбцов. Без индекса MySQL должен начать с первой строки, а затем прочитать всю таблицу, чтобы найти соответствующие строки.

Как правило, эти «фиксированные» данные представляют собой отдельный столбец/поле; со строковыми полями (такими как varchar или text) вы можете иметь индекс префикса, а не весь столбец. Посетите CREATE INDEX для получения дополнительной информации об этом.

Уникальный индекс, который вы пытаетесь создать в своем примере, всегда будет иметь одну запись; это не очень полезный индекс, поскольку он не помогает искать всю таблицу. Однако, если вы проиндексируете свою таблицу по userID, friendID, использование функций LEAST() и GREATEST() в операторе SELECT будет оптимизировано благодаря самому индексу, поэтому в данном случае это может быть то, что вам нужно.

person newfurniturey    schedule 25.11.2014
comment
Итак, есть ли другое решение, которое работает в MySQL для создания ограничения, описанного в заголовке stackoverflow.com/questions/10159411/? - person Busiek; 26.11.2014