Come rimuovere le righe duplicate da una tabella in SQL Server

Traduzione articoli Traduzione articoli
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

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com