Como remover linhas duplicadas de uma tabela no SQL Server

IMPORTANTE: Este artigo foi traduzido pelo software de tradução automática da Microsoft e eventualmente pode ter sido editado pela Microsoft Community através da tecnologia Community Translation Framework (CTF) ou por um tradutor profissional. A Microsoft oferece artigos traduzidos automaticamente por software, por tradutores profissionais e editados pela comunidade para que você tenha acesso a todos os artigos de nossa Base de Conhecimento em diversos idiomas. No entanto, um artigo traduzido pode conter erros de vocabulário, sintaxe e/ou gramática. A Microsoft não é responsável por qualquer inexatidão, erro ou dano causado por qualquer tradução imprecisa do conteúdo ou por seu uso pelos nossos clientes.

Clique aqui para ver a versão em Inglês deste artigo: 139444
Sumário
Tabelas do Microsoft SQL Server nunca devem conter linhas duplicadas, chaves primárias exclusivas de nornon. Por questões de brevidade, será às vezes nos referimos a primarykeys como "chave" ou "CP" neste artigo, mas isso sempre denota "primarykey". PKs duplicados são uma violação de integridade da entidade e devem bedisallowed em um sistema relacional. SQL Server possui vários integridade da entidade forenforcing mecanismos, incluindo índices, restrições UNIQUE, restrições PRIMARY KEY e disparadores.

Apesar disso, em circunstâncias incomuns chaves primárias duplicadas podem ocorrer e, nesse caso deve ser eliminadas. Uma maneira podem ocorrer é se duplicatePKs existe em dados não-relacionais fora do SQL Server e o isimported de dados enquanto não está sendo aplicada a exclusividade de CP. Outra maneira canoccur é por meio de um erro de design de banco de dados, como não aplicar o entityintegrity em cada tabela.

Freqüência PKs duplicados são notados quando você tentar criar um índice exclusivo, será anulada se forem encontradas chaves duplicadas. Essa mensagem é:
Índice exclusivo do msg 1505, nível 16, estado 1Crie anulada na chave duplicada.
Se você estiver usando o SQL Server 2000 ou SQL Server 2005, você receberá a seguinte mensagem de erro:
Msg 1505, nível 16, estado 1 CREATE UNIQUE INDEX finalizado porque uma chave duplicada foi encontrada para o nome do objeto ' %. * ls' e o nome de índice ' %. * ls'. O valor de chave duplicado é %ls.
Este artigo descreve como localizar e remover a tabela de froma de chaves primárias duplicadas. No entanto, você deve examinar atentamente o processo que permitido theduplicates aconteça para evitar uma recorrência.

Mais Informações
Neste exemplo, usaremos a tabela a seguir com os valores de CP duplicados. Nesta tabela, a chave primária é duas colunas (col1, col2). Nós cannotcreate um índice exclusivo ou a restrição de chave primária desde duas linhas haveduplicate PKs. Este procedimento ilustra como identificar e remover theduplicates.
create table t1(col1 int, col2 int, col3 char(50))insert into t1 values (1, 1, 'data value one')insert into t1 values (1, 1, 'data value one')insert into t1 values (1, 2, 'data value two')				
A primeira etapa é identificar quais linhas têm valores de chave primária duplicadas:
SELECT col1, col2, count(*)FROM t1GROUP BY col1, col2HAVING count(*) > 1				
Isso retornará uma linha para cada conjunto de valores de CP duplicados na tabela. A última coluna esse resultado é o número de duplicatas para o valor de CP theparticular.

Col1Col2
112


Se houver apenas alguns conjuntos de valores de CP duplicados, o melhor é procedimento excluí-las manualmente em uma base individual. Por exemplo:
set rowcount 1delete from t1where col1=1 and col2=1				
O valor do número de linhas deve ser n-1 o número de duplicatas para um determinado valor de chave. Neste exemplo, existem 2 duplicatas para que o número de linhas é definido como 1. Os valores de col1/col2 são tirados do resultado da consulta GROUP BY acima. Se a consulta GROUP BY retorna várias linhas, a consulta "set rowcount" precisa ser executado uma vez para cada uma dessas linhas. Cada vez que for executada, defina rowcount para n-1 o número de duplicatas de determinado valor de CP.

Antes de excluir as linhas, você deverá verificar se o isduplicate da linha inteira. Embora seja improvável, é possível que os valores de CP são duplicados, mas a linha como um todo não é. Um exemplo disso seria uma tabela withSocial número de segurança como a chave primária, e cada um com duas pessoas (ou linhas) diferentes com o mesmo número, tendo atributos exclusivos. No caso de sucha qualquer mau funcionamento causado chave duplicada pode ter também dados exclusivos de causedvalid para ser colocado na linha. Esses dados devem copiado-out andpreserved de estudo e reconciliação possível antes de excluir os dados.

Se houver muitos conjuntos distintos de valores de CP duplicados na tabela, ele talvez muito demorado para removê-los individualmente. Nesse caso asseguintes procedimento pode ser usado:
  1. Primeiro, execute a consulta acima GROUP BY para determinar quantos conjuntos de valores de CP duplicados existem e a contagem de duplicatas para cada conjunto.
  2. Selecione os valores de chave duplicados em uma tabela de retenção. Por exemplo:
    SELECT col1, col2, col3=count(*)INTO holdkeyFROM t1GROUP BY col1, col2HAVING count(*) > 1					
  3. Selecione as linhas duplicadas em uma tabela de retenção, eliminação de duplicatas no processo. Por exemplo:
    SELECT DISTINCT t1.*INTO holddupsFROM t1, holdkeyWHERE t1.col1 = holdkey.col1AND t1.col2 = holdkey.col2					
  4. Neste ponto, a tabela holddups deve ter PKs exclusivos, no entanto, isso não será o caso se t1 tivesse PKs duplicados, mas linhas únicas (como no exemplo SSN acima). Verifique se cada chave holddups é exclusivo e que você não tem chaves duplicadas, mas linhas únicas. Se assim, você deve parar aqui e reconciliar que as linhas que deseja manter para um determinado valor de chave duplicado. Por exemplo, a consulta:
    SELECT col1, col2, count(*)FROM holddupsGROUP BY col1, col2						
    deve retornar uma contagem de 1 para cada linha. Se Sim, vá para a etapa 5 abaixo. Se não, você tem chaves duplicadas, mas linhas únicas e precisa decidir quais linhas deseja salvar. Isso geralmente envolvem o descartar uma linha ou criar um novo valor de chave exclusivo para esta linha. Execute uma dessas duas etapas para cada tal CP duplicado na tabela holddups.
  5. Exclua linhas duplicadas da tabela original. Por exemplo:
    DELETE t1FROM t1, holdkeyWHERE t1.col1 = holdkey.col1AND t1.col2 = holdkey.col2					
  6. Coloque as linhas exclusivas na tabela original. Por exemplo:
    INSERT t1 SELECT * FROM holddups					
eliminação de duplicação de sql6 intg de entidade

Aviso: este artigo foi traduzido automaticamente

Proprietà

ID articolo: 139444 - Ultima revisione: 05/21/2016 08:58:00 - Revisione: 5.0

Microsoft SQL Server 6.0 Standard Edition, Microsoft SQL Server 6.5 Standard Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbsqlsetup kbinfo kbusage kbmt KB139444 KbMtpt
Feedback