Как указать уникальное ограничение для нескольких столбцов в MySQL?

698

У меня есть таблица:

table votes (
    id,
    user,
    email,
    address,
    primary key(id),
);

Теперь я хочу сделать столбцы пользователей, электронной почты, адреса уникальными (вместе).

Как это сделать в MySql?

  • Конечно, пример - это просто... пример. Поэтому, пожалуйста, не беспокойтесь о семантике.
Теги:
unique-constraint
database-table
composite-key

10 ответов

1164
Лучший ответ
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
  • 29
    Будет ли это правильно работать с предложением ON DUPLICATE KEY операторов INSERT? То есть, если бы я пытался вставить строку, которая конфликтовала со значениями пользователя / адреса электронной почты / адреса другой строки, INSERT будет выполнять действия, указанные в предложении ON DUPLICATE KEY?
  • 3
    Таким образом, комбинация из трех будет уникальной? Или все три отдельных столбца будут уникальными?
Показать ещё 13 комментариев
182

У меня есть таблица MySQL:

CREATE TABLE `content_html` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_box_elements` int(11) DEFAULT NULL,
  `id_router` int(11) DEFAULT NULL,
  `content` mediumtext COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`)
);

а UNIQUE KEY работает так, как ожидалось, он допускает несколько NULL строк id_box_elements и id_router.

Я запускаю MySQL 5.1.42, поэтому, возможно, появилось некоторое обновление по обсуждаемой проблеме. К счастью, он работает и, надеюсь, останется таким.

  • 31
    Я хотел пометить этот ответ, так как он показывает, как создать новую таблицу с уникальным индексом, где в ответе jonstjohn выше рассказывается, как обновить существующую таблицу. Они делают то же самое, хотя зависит только от того, создаете ли вы новую таблицу или обновляете существующую. :)
  • 3
    что со всеми обратными кавычками, они служат какой-то цели?
Показать ещё 1 комментарий
45

Уникальные индексы с несколькими столбцами не работают в MySQL, если у вас есть значение NULL в строке, поскольку MySQL рассматривает NULL как уникальное значение и по крайней мере в настоящее время не имеет логики для работы в нем в многоколоночных индексах. Да, поведение безумное, потому что оно ограничивает множество законных приложений многоколоночных индексов, но это то, что есть... На данный момент это ошибка, которая была отмечена как "не будет исправлена" в MySQL ошибка-трек...

  • 11
    Два уточняющих момента: 1) это поведение не выполняется для ENGINE BDB , и, 2) это документированное поведение, хотя, ИМХО, не документировано достаточно открыто, учитывая, насколько это может быть удивительно / неприятно. См. MySQL bug 25544 bugs.mysql.com/bug.php?id=25544 для обсуждения.
  • 1
    Спасибо за NULL заголовки, решил проблему, которая у меня была ... Я думаю, что я пойду с контрольной суммой хеша
Показать ещё 3 комментария
21

Вы пробовали это?

UNIQUE KEY `thekey` (`user`,`email`,`address`)
  • 0
    Я попробовал это, но это не похоже на работу. Я попробую снова.
  • 0
    То, что сказал Эрик, прекрасно работает для меня: UNIQUE KEY thekey` ( user , email , address ) `. Я использую MYSQL версии 5.5.24. Вы можете установить это даже в PHPMYADMIN, если вы его используете. Я использую 3.5.1 версию PMA.
Показать ещё 1 комментарий
11

Это работает для mysql версии 5.5.32

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);
  • 1
    Кажется, работает без одинарных кавычек на имя столбца.
6

Вы можете добавить уникальные индексы с несколькими столбцами с помощью phpMyAdmin. (Я тестировал в версии 4.0.4)

Перейдите на страницу структура для целевой таблицы. Добавьте уникальный индекс в один из столбцов. Разверните список индексов в нижней части страницы структуры, чтобы увидеть уникальный индекс, который вы только что добавили. Щелкните значок редактирования, и в следующем диалоге вы можете добавить дополнительные столбцы к этому уникальному индексу.

4

MySql 5 или выше ведет себя так (я только что протестировал):

  • вы можете определить уникальные ограничения, содержащие столбцы с нулевым значением. Скажем, вы определяете уникальное ограничение (A, B), где A не является NULL, но B является
  • при оценке такого ограничения вы можете иметь (A, null) столько раз, сколько хотите (то же самое значение!)
  • у вас может быть только одна (A, не нуль B) пара

Пример: PRODUCT_NAME, PRODUCT_VERSION 'glass', null 'glass', null 'вино', 1

Теперь, если вы попытаетесь вставить ( "вино" 1) снова, он сообщит о нарушении ограничения Надеюсь, что это поможет

1

Я делаю это так:

CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);

Мое соглашение для уникального index_name - TableName_Column1_Column2_Column3_uindex.

1

Для добавления уникального индекса требуется следующее:

1) table_name
2) index_name
3) столбцы, на которые вы хотите добавить индекс

ALTER TABLE  `tablename` 
ADD UNIQUE index-name
(`column1` ,`column2`,`column3`,...,`columnN`);

В вашем случае мы можем создать уникальный индекс следующим образом:

ALTER TABLE `votes`ADD 
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);
1

Если вы хотите избежать дубликатов в будущем. Создайте еще один столбец, скажем, id2.

UPDATE tablename SET id2 = id;

Теперь добавьте уникальное значение в два столбца:

alter table tablename add unique index(columnname, id2);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню