Как указать уникальное ограничение для нескольких столбцов в MySQL? - PullRequest
801 голосов
/ 11 марта 2009

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

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

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

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

  • Конечно, пример - это просто ... пример. Поэтому, пожалуйста, не беспокойтесь о семантике.

Ответы [ 11 ]

1321 голосов
/ 11 марта 2009
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
211 голосов
/ 09 августа 2010

У меня есть таблица 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, поэтому, возможно, произошла некоторая информация по проблеме, рассмотренной выше. К счастью, это работает и, надеюсь, так и останется.

45 голосов
/ 08 мая 2010

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

23 голосов
/ 11 марта 2009

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

UNIQUE KEY `thekey` (`user`,`email`,`address`)
11 голосов
/ 02 января 2014

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

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);
6 голосов
/ 20 марта 2014

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

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

5 голосов
/ 03 августа 2014

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

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

Пример: PRODUCT_NAME, PRODUCT_VERSION «стекло», ноль «стекло», ноль «вино», 1

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

2 голосов
/ 28 июня 2018

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

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

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

1 голос
/ 10 июля 2014

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

1) имя_таблицы
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 голос
/ 09 марта 2013

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

UPDATE tablename SET id2 = id;

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

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