it-swarm.com.ru

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

У меня есть стол:

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

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

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

  • Конечно, пример просто ... пример. Поэтому, пожалуйста, не беспокойтесь о семантике.
771
Niyaz
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
1284
jonstjohn

У меня есть таблица 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 работает так же, как и ожидалось, он допускает несколько пустых строк id_box_elements и id_router. 

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

204
Frodik

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

44
niksoft

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

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

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

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

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

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

6
Vince K

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

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

Пример: PRODUCT_NAME, PRODUCT_VERSION 'Glass', null 'Glass', null 'Wine', 1

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

5
Cristian Botiza

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

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

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

2
LXXIII

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

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
sandeep vanama

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

UPDATE tablename SET id2 = id;

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

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

Если вы создаете таблицу в 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)
);
0
Devendra Singraul