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?

Foi útil?

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.

http://support.microsoft.com/kb/139444

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/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top