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


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

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

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

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

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

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, если у вас есть нулевое значение в строке, поскольку 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 или выше ведет себя так (я только что протестировал):

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

пример: PRODUCT_NAME, PRODUCT_VERSION 'glass', null 'стекло', ноль 'вина', 1

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

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

UPDATE tablename SET id2 = id;

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

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

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

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`);

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

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

моя конвенция для уникального index_name и 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)
);