Respostas:
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
Eu tenho uma tabela 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`)
);
e a UNIQUE KEY funciona da maneira esperada, permitindo várias linhas NULL de id_box_elements e id_router.
Estou executando o MySQL 5.1.42, então provavelmente houve alguma atualização sobre o problema discutido acima. Felizmente, funciona e espero que continue assim.
Os índices exclusivos de várias colunas não funcionam no MySQL se você tiver um valor NULL em linha, pois o MySQL trata NULL como um valor exclusivo e, pelo menos atualmente, não tem lógica para contorná-lo em índices de várias colunas. Sim, o comportamento é insano, porque limita muitas aplicações legítimas de índices de várias colunas, mas é o que é ... Até agora, é um bug que foi carimbado com "não será corrigido" no MySQL rastrear insetos ...
ENGINE BDB
e, 2) esse é um comportamento documentado , embora IMHO não tenha sido suficientemente documentado, dado o quão surpreendente / desagradável pode ser. Veja o bug 25544 do MySQL bugs.mysql.com/bug.php?id=25544 para uma discussão.
Você já tentou isso?
UNIQUE KEY `thekey` (`user`,`email`,`address`)
UNIQUE KEY
thekey` ( user
, email
, address
) `. Estou usando o MYSQL versão 5.5.24. Você pode definir isso mesmo no PHPMYADMIN se estiver usando. Estou usando a versão 3.5.1 do PMA.
Isso funciona para o mysql versão 5.5.32
ALTER TABLE `tablename` ADD UNIQUE (`column1` ,`column2`);
O MySql 5 ou superior se comporta assim (eu acabei de testar):
Exemplo: PRODUCT_NAME, PRODUCT_VERSION 'copo', nulo 'copo', nulo 'vinho', 1
Agora, se você tentar inserir ('wine' 1) novamente, ele relatará uma violação de restrição Espero que isso ajude
Você pode adicionar índices exclusivos de várias colunas via phpMyAdmin . (Eu testei na versão 4.0.4)
Navegue para a página de estrutura da sua tabela de destino. Adicione um índice exclusivo a uma das colunas. Expanda a lista Índices na parte inferior da página da estrutura para ver o índice exclusivo que você acabou de adicionar. Clique no ícone de edição e, na caixa de diálogo a seguir, você pode adicionar colunas adicionais a esse índice exclusivo.
Eu faço assim:
CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);
Minha convenção para um único index_name
é TableName_Column1_Column2_Column3_uindex
.
Para adicionar um índice exclusivo, é necessário o seguinte:
1) table_name
2) index_name
3) colunas nas quais você deseja adicionar índice
ALTER TABLE `tablename`
ADD UNIQUE index-name
(`column1` ,`column2`,`column3`,...,`columnN`);
No seu caso, podemos criar um índice exclusivo da seguinte maneira:
ALTER TABLE `votes`ADD
UNIQUE <votesuniqueindex>;(`user` ,`email`,`address`);
Se você estiver criando tabela no mysql, use o seguinte:
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)
);
Primeiro, livre-se das duplicatas existentes
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;
Em seguida, adicione a restrição exclusiva
ALTER TABLE votes ADD UNIQUE unique_index(user, email, address);
Verifique a restrição com
SHOW CREATE TABLE votes;
Observe que o usuário, email, endereço será considerado único se algum deles tiver valor nulo.
Para PostgreSQL ... Não funcionou para mim com índice; isso me deu um erro, então eu fiz isso:
alter table table_name
add unique(column_name_1,column_name_2);
O PostgreSQL deu ao índice exclusivo seu próprio nome. Eu acho que você pode alterar o nome do índice nas opções da tabela, se for necessário alterar ...