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

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

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

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

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

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

11 ответов


ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);

У меня есть таблица 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`)
);

и уникальный ключ работает так же, как ожидалось, он позволяет несколько нулевых строк id_box_elements и id_router.

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


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


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

UNIQUE KEY `thekey` (`user`,`email`,`address`)

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

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);

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

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


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

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

пример: ИМЯ_ПРОДУКТА, PRODUCT_VERSION 'glass', null "стекло", ноль 'вина', 1

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


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

UPDATE tablename SET id2 = id;

теперь добавьте unique в два столбца:

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

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

1) имя_таблицы
2) имяиндекса
3) столбцы, на которые вы хотите добавить index

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

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

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

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

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

моя конвенция для уникального index_name is TableName_Column1_Column2_Column3_uindex.


Если вы создаете таблицу в MySQL, то используйте следующее :

create table package_template_mapping (
mapping_id  int(10) not null auto_increment  ,
template_id int(10) NOT NULL ,
package_id  int(10) NOT NULL ,
remark      varchar(100),
primary key (mapping_id) ,
UNIQUE KEY template_fun_id (template_id , package_id)
);