Mudando o campo da tabela para exclusivo
Pergunta
Eu quero executar o seguinte comando sql:
ALTER TABLE `my_table` ADD UNIQUE ( `ref_id` , `type` );
O problema é que alguns dos dados da tabela tornariam isso inválido, portanto, alterar a tabela falha.
Existe uma maneira inteligente no MySQL para excluir as linhas duplicadas?
Solução
Se você não se importa com qual linha for excluída, use ignorar:
ALTER IGNORE TABLE `my_table` ADD UNIQUE (
`ref_id` ,
`type`
);
Outras dicas
O SQL pode, na melhor das hipóteses, lidar com isso arbitrariamente. Dito de outra maneira: este é o seu problema.
Você tem dados que atualmente não são exclusivos. Você quer torná -lo único. Você precisa decidir como lidar com as duplicatas.
Existem várias maneiras de lidar com isso:
- Modificar ou excluir linhas duplicadas manualmente se os números forem suficientemente pequenos;
- Declarações em execução para atualizar ou excluir a duplicata que atendem a certos critérios para chegar a um ponto em que as exceções possam ser tratadas individualmente;
- Copiar os dados para uma tabela temporária, esvaziar o original e usar consultas para repovoar a tabela; e
- em breve.
Observação: Tudo isso requer intervenção do usuário.
É claro que você pode copiar a tabela para uma tabela temporária, esvaziar o original e copiar nas linhas, apenas ignorando aqueles que falham, mas espero que isso não lhe dê os resultados que você realmente deseja.
O que você pode fazer é adicionar uma coluna de identidade temporária à sua tabela. Com isso, você pode escrever consulta para identificar e excluir as duplicatas (você pode modificar um pouco a consulta para garantir que apenas uma cópia do conjunto de linhas duplicadas seja retida).
Quando isso for feito, solte a coluna temporária e adicione restrições exclusivas à sua coluna original.
Espero que isto ajude.
O que eu fiz no passado é exportar o conjunto exclusivo de dados, soltar a tabela, recriá -los com as colunas exclusivas e importar os dados.
Muitas vezes, é mais rápido do que tentar descobrir como excluir os dados duplicados.
Há um bom artigo da KB que fornece uma abordagem passo a passo para encontrar e remover linhas que tenham valores duplicados. Ele fornece duas abordagens - uma abordagem única para encontrar e remover uma única linha e uma solução mais ampla para resolver isso quando muitas linhas estão envolvidas.
Aqui está um trecho que eu costumava excluir linhas duplicadas em uma das mesas
BEGIN TRANSACTION
Select *,
rank() over (Partition by PolicyId, PlanSeqNum, BaseProductSeqNum,
CoInsrTypeCd, SupplierTypeSeqNum
order by CoInsrAmt desc) as MyRank
into #tmpTable
from PlanCoInsr
select distinct PolicyId,PlanSeqNum,BaseProductSeqNum,
SupplierTypeSeqNum, CoInsrTypeCd, CoInsrAmt
into #tmpTable2
from #tmpTable where MyRank=1
truncate table PlanCoInsr
insert into PlanCoInsr
select * from #tmpTable2
drop table #tmpTable
drop table #tmpTable2
COMMIT
Isso funcionou para mim:
ALTER TABLE table_name ADD UNIQUE KEY field_name (field_name)
Você terá que encontrar algum outro campo único porque excluir apenas ref_id e digite excluirá todos eles.
Para obter as duplicatas:
select ref_id, type from my_table group by ref_id, type having count(*)>1
O XARPB tem alguns truques inteligentes (talvez muito inteligentes): http://www.xaprb.com/blog/2007/02/06/how-to-delete-duplicate-rows-with-sql-part-2/