MySQL - Tornar um campo existente exclusivo

155

Eu tenho uma tabela já existente com um campo que deve ser exclusivo, mas não é. Só sei disso porque uma entrada foi feita na tabela que tinha o mesmo valor que outra entrada já existente e isso causou problemas.

Como faço para que este campo aceite apenas valores exclusivos?

Lothar
fonte

Respostas:

293
ALTER IGNORE TABLE mytbl ADD UNIQUE (columnName);

Para o MySQL 5.7.4 ou posterior:

ALTER TABLE mytbl ADD UNIQUE (columnName);

A partir do MySQL 5.7.4, a cláusula IGNORE para ALTER TABLE é removida e seu uso produz um erro.

Portanto, certifique-se de remover as entradas duplicadas primeiro, pois a palavra-chave IGNORE não é mais suportada.

Referência

WuHoUnited
fonte
62
+1 If IGNORE is specified, only the first row is used of rows with duplicates on a unique key, The other conflicting rows are deleted. Docs
The Scrum Meister
1
Existe uma maneira de dizer para excluir linhas com base em um determinado critério? Ou você precisaria fazer algum pré-processamento antes ALTERde fazer isso.
CorsiKa
7
ALTER IGNOREainda pode ocorrer erro duplicado na versão MySQL> 5.5 e no InnoDB para a segurança dos seus dados. Se você tem certeza de que manter a primeira das linhas duplicadas é a coisa certa, tente set session old_alter_table=1. Não se esqueça de devolvê-lo. mysqlolyk.wordpress.com/2012/02/18/…
michaelliu
2
Para quem se deparar com isso usando 5.6.7 ou superior, o IGNORE não é mais suportado. moredocs Acho que a maneira de fazer isso agora é garantir que você não tenha duplicatas primeiro, não?
William T. Mallard
1
Certifique-se de fazer uma cópia de backup da tabela antes de executar esta consulta. Ele excluirá todas as linhas, exceto a primeira, se o nome da coluna tiver os mesmos valores ou estiver vazio.
steady_daddy
34

Basta escrever esta consulta no seu db phpmyadmin.

ALTER TABLE TableName ADD UNIQUE (FieldName)

Por exemplo: ALTER TABLE user ADD UNIQUE (email)

Rizwan Shamsher Kaim Khani
fonte
16

Se você também quiser nomear a restrição, use este:

ALTER TABLE myTable
  ADD CONSTRAINT constraintName 
    UNIQUE (columnName);
ypercubeᵀᴹ
fonte
7

CREATE UNIQUE INDEX foo ON table_name (field_name)

Você precisa remover valores duplicados nessa coluna antes de executar esse sql. Qualquer valor duplicado existente nessa coluna levará você ao erro mysql 1062

Zulan
fonte
4

A maneira mais fácil e rápida seria com a tabela de estrutura phpmyadmin.

USE O PHPMYADMIN ADMIN PANEL!

Lá está no idioma russo, mas na versão em inglês deve ser o mesmo. Basta clicar no botão Exclusivo. Também a partir daí, você pode tornar suas colunas PRIMARY ou DELETE.

MKA
fonte
2
ALTER IGNORE TABLE mytbl ADD UNIQUE (columnName);

é a resposta certa

a peça de inserção

INSERT IGNORE INTO mytable ....
user3772326
fonte
1

Este código é para resolver nosso problema para definir uma chave exclusiva para a tabela existente

alter ignore table ioni_groups add unique (group_name);
KARTHIKEYAN.A
fonte
Mas remove todas as duplicatas, incluindo as que estão fora das colunas
Biasi Wiga 17/03