Відповіді:
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`)
);
і UNIQUE KEY працює так, як очікувалося, він дозволяє кілька NULL рядків id_box_elements і id_router.
Я запускаю MySQL 5.1.42, тому, ймовірно, було якесь оновлення щодо проблеми, обговореної вище. На щастя, це працює і, сподіваємось, так і залишиться.
Унікальні індекси з декількома стовпцями не працюють у MySQL, якщо у вас є значення NULL у рядку, оскільки MySQL трактує NULL як унікальне значення та принаймні на даний момент не має логіки обійти його в індексних колонках. Так, поведінка божевільна, тому що вона обмежує безліч законних застосувань багатоколонних індексів, але це те, що це є ... Наразі це помилка, яку зафіксували "не виправити" на MySQL помилка ...
ENGINE BDB
, і 2) це документоване поведінка, хоча, ІМХО, недостатньо задокументоване, враховуючи, наскільки дивовижним / неприємним воно може бути. Див. Помилку MySQL 25544 bugs.mysql.com/bug.php?id=25544 для обговорення.
Ви пробували це?
UNIQUE KEY `thekey` (`user`,`email`,`address`)
UNIQUE KEY
thekey` ( user
, email
, address
) `. Я використовую MYSQL версії 5.5.24 Ви можете встановити це навіть у PHPMYADMIN, якщо ви його використовуєте. Я використовую 3.5.1 версію PMA.
Це працює для mysql версії 5.5.32
ALTER TABLE `tablename` ADD UNIQUE (`column1` ,`column2`);
MySql 5 або вище поводиться так (я щойно тестував):
Приклад: PRODUCT_NAME, PRODUCT_VERSION 'келих', null 'келих', null 'wine', 1
Тепер, якщо ви спробуєте вставити знову ("wine" 1), це повідомить про порушення обмеження. Сподіваюся, це допоможе
Ви можете додати унікальні індекси з декількома стовпцями через phpMyAdmin . (Я тестував у версії 4.0.4)
Перейдіть на сторінку структури для цільової таблиці. Додайте унікальний індекс в один із стовпців. Розгорніть список індексів у нижній частині сторінки структури, щоб побачити унікальний індекс, який ви тільки що додали. Клацніть піктограму редагування, і в наступному діалоговому вікні ви можете додати додаткові стовпці до цього унікального індексу.
Я роблю це так:
CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);
Моя конвенція про унікальне index_name
є TableName_Column1_Column2_Column3_uindex
.
Для додавання унікального індексу потрібно:
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`);
Якщо ви створюєте таблицю в 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)
);
Спочатку позбудьтесь наявних дублікатів
delete a from votes as a, votes as b where a.id < b.id
and a.user <=> b.user and a.email <=> b.email
and a.address <=> b.address;
Потім додайте унікальне обмеження
ALTER TABLE votes ADD UNIQUE unique_index(user, email, address);
Перевірте обмеження за допомогою
SHOW CREATE TABLE votes;
Зауважте, що користувач, електронна адреса та адреса будуть вважатися унікальними, якщо будь-яка з них має нульове значення.
Для PostgreSQL ... Це не працювало для мене з індексом; це дало мені помилку, тому я зробив це:
alter table table_name
add unique(column_name_1,column_name_2);
PostgreSQL дав унікальному індексу власну назву. Я думаю, ви можете змінити ім'я індексу в параметрах таблиці, якщо це потрібно змінити ...