Como eu especifico restrição exclusiva para múltiplas colunas no MySQL?

Eu tenho uma mesa:

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

Agora quero fazer com que as colunas usuário, email, endereço sejam únicas (juntas).

Como faço isso no MySql?

  • Claro que o exemplo é apenas … um exemplo. Então, por favor, não se preocupe com a semântica.

     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 como esperado, permite 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 assunto discutido acima. Felizmente funciona e espero que continue assim.

    Índices exclusivos de múltiplas colunas não funcionam no MySQL se você tiver um valor NULL na linha, já que o MySQL trata NULL como um valor único e pelo menos atualmente não possui lógica para contorná-lo em índices de múltiplas colunas. Sim, o comportamento é insano, porque ele limita um monte de aplicativos legítimos de índices multi-coluna, mas é o que é … Até agora, é um bug que foi carimbado com “não vai consertar” no MySQL trilha de bugs …

    Você já tentou isso?

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

    Isso funciona para a versão 5.5.32 do mysql

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

    Você pode adicionar índices exclusivos de múltiplas colunas via phpMyAdmin . (Eu testei na versão 4.0.4)

    Navegue até 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 checkbox de diálogo a seguir, você pode adicionar colunas adicionais a esse índice exclusivo.

    MySql 5 ou superior se comporta assim (acabei de testar):

    • você pode definir restrições exclusivas envolvendo colunas anuláveis. Digamos que você defina uma restrição única (A, B) onde A não é anulável, mas B é
    • Ao avaliar essa restrição, você pode ter (A, null) quantas vezes quiser (o mesmo valor A!)
    • você só pode ter um par (A, não nulo B)

    Exemplo: PRODUCT_NAME, PRODUCT_VERSION “glass”, null “glass”, null “wine”, 1

    Agora, se você tentar inserir (‘vinho’ 1) novamente, ele reportará uma violação de restrição. Espero que isso ajude

    Se você quiser evitar duplicatas no futuro. Crie outra coluna, diga id2.

     UPDATE tablename SET id2 = id; 

    Agora adicione o exclusivo em duas colunas:

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

    Para adicionar um índice exclusivo, é necessário seguir:

    1) table_name
    2) index_name
    3) colunas em que você deseja adicionar o índice

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

    No seu caso, podemos criar um índice exclusivo da seguinte forma:

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

    Eu faço assim:

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

    Minha convenção para um nome de index_name exclusivo é TableName_Column1_Column2_Column3_uindex .