Come rimuovere le righe duplicate da una tabella in SQL Server

Identificativo articolo: 139444 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

Sommario

Tabelle di Microsoft SQL Server non devono contenere righe duplicate, né le chiavi primarie non univoche. Per brevità, si farà spesso riferimento alle chiavi primarie come "chiave" o "Chiave" in questo articolo, ma questo verrà sempre indicare "chiave primaria". PKs duplicati sono una violazione di integrità di entità e deve essere consentito in un sistema relazionale. SQL Server dispone di diversi meccanismi per applicare l'integrità di entità, inclusi gli indici, vincoli UNIQUE, vincoli PRIMARY KEY e trigger.

Nonostante ciò, chiavi primarie duplicate possono verificarsi circostanze insolite, e in tal caso deve essere eliminate. Un metodo che può verificarsi è se PKs duplicati presenti in dati non relazionali esterne di SQL Server e importato i dati mentre l'univocità della chiave non è che vengano applicato. In alternativa, che può verificarsi è tramite un errore di progettazione di database, ad esempio non applicare l'integrità di entità in ogni tabella.

PKs duplicati sono spesso notato quando si tenta di creare un indice univoco, che verrà interrotto se vengono rilevate chiavi duplicate. Questo messaggio è:
Msg 1505, livello 16, stato 1 Crea indice univoco interrotta nella chiave duplicati.
Se si utilizza SQL Server 2000 o SQL Server 2005, è possibile che venga visualizzato il seguente messaggio di errore:
Msg 1505, livello 16, stato 1 CREATE UNIQUE INDEX terminata perché una chiave duplicata è stata trovata per il nome di oggetto ' %. * ls 'e nome di indice' %. * ls'. Il valore di chiave duplicato è % 1!.
In questo articolo viene illustrato come individuare e rimuovere le chiavi primarie duplicate da una tabella. Tuttavia, è necessario esaminare attentamente il processo che i duplicati si verifica per evitare una ricorrenza.

Informazioni

In questo esempio, verrà utilizzato nella tabella riportata di seguito con valori di chiave duplicati. In questa tabella la chiave primaria è le due colonne (col1, col2). È Impossibile creare un indice univoco o un vincolo PRIMARY KEY perché due righe hanno PKs duplicati. Questa procedura viene illustrato come identificare e rimuovere i duplicati.
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')
				
il primo passaggio è identificare quali righe avere valori di chiave primari duplicati:
SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1
				
questo restituirà una riga per ciascun insieme di valori di chiave duplicati nella tabella. L'ultima colonna questo risultato è il numero di duplicati per il particolare valore di chiave pubblica.

Riduci questa tabellaEspandi questa tabella
Col1Col2
112


Se sono presenti solo alcuni set di valori di chiave duplicati, la procedura migliore consiste nell'eliminare questi manualmente su base individuale. Ad esempio:
set rowcount 1
delete from t1
where col1=1 and col2=1
				
il valore di conteggio delle righe deve essere n-1 il numero di duplicati per un determinato valore di chiave. In questo esempio, esistono 2 duplicati i conteggio delle righe è impostato su 1. I valori di col1/col2 derivano dalle precedente GROUP BY risultato della query. Se la query GROUP BY restituisce più righe, la query "set rowcount" dovrà essere eseguito una volta per ognuna di queste righe. Ogni volta che viene eseguito, impostate mediante conteggio delle righe a n-1 il numero di duplicati di particolare valore di chiave pubblica.

Prima di eliminare le righe, è necessario verificare che l'intera riga è duplicato. Sebbene improbabile, è possibile che i valori di chiave sono duplicati, ma la riga nel suo complesso non. Un esempio potrebbe essere una tabella con Social Security Number come chiave primaria, e verificano due diversi utenti (o righe) con lo stesso numero, ciascuno con attributi univoci. In tal caso qualsiasi malfunzionamento causato la chiave duplicata può essere anche causato validi dati univoci da inserire nella riga. Questi dati devono essere copiati e salvato per la riconciliazione Studio e le possibili prima di eliminare i dati.

Se esistono molti insiemi distinti di valori di chiave duplicati nella tabella, potrebbe essere troppo lunga per rimuoverli individualmente. In questo caso è possibile utilizzare la procedura seguente:
  1. In primo luogo, eseguire la query GROUP BY precedente per determinare il numero di insiemi di valori chiave duplicati presenti e il numero di duplicati per ogni set.
  2. Selezionare i valori di chiavi duplicati in una tabella contenente. Ad esempio:
    SELECT col1, col2, col3=count(*)
    INTO holdkey
    FROM t1
    GROUP BY col1, col2
    HAVING count(*) > 1
    					
  3. Selezionare le righe duplicate in una tabella contenente, eliminando i duplicati nel processo. Ad esempio:
    SELECT DISTINCT t1.*
    INTO holddups
    FROM t1, holdkey
    WHERE t1.col1 = holdkey.col1
    AND t1.col2 = holdkey.col2
    					
  4. A questo punto, la tabella holddups deve dispone PKs univoco, tuttavia, questo non sarà il caso se t1 PKs duplicati, ma le righe univoche (come nell'esempio SSN sopra riportato). Verificare che ogni chiave in holddups sia univoco e che non si dispone chiavi duplicate, ma le righe univoche. In caso affermativo, è necessario interrompere la procedura e riconciliare quale tra le righe che si desidera mantenere per un determinato valore di chiave duplicato. Ad esempio, la query:
    SELECT col1, col2, count(*)
    FROM holddups
    GROUP BY col1, col2
    						
    deve restituire il numero di 1 per ogni riga. Se Sì, procedere al passaggio 5. Se no, si dispone di chiavi duplicate, ma le righe univoche e necessario decidere le righe da salvare. Questo in genere comporterà l'eliminazione di una riga oppure creando un nuovo valore di chiave univoco per questa riga. Effettuare una di queste due operazioni per ogni tale chiave duplicati nella tabella holddups.
  5. Eliminare le righe duplicate dalla tabella originale. Ad esempio:
    DELETE t1
    FROM t1, holdkey
    WHERE t1.col1 = holdkey.col1
    AND t1.col2 = holdkey.col2
    					
  6. Inserire le righe univoche nuovamente nella tabella originale. Ad esempio:
    INSERT t1 SELECT * FROM holddups
    					

Proprietà

Identificativo articolo: 139444 - Ultima modifica: mercoledì 23 novembre 2005 - Revisione: 4.2
Le informazioni in questo articolo si applicano a:
  • 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
Chiavi: 
kbmt kbinfo kbusage KB139444 KbMtit
Traduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 139444
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti