Dubbele rijen verwijderen uit een tabel in SQL Server

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 139444 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Samenvatting

Microsoft SQL Server-tabellen mag nooit dubbele rijen bevatten, noch niet-unieke primaire sleutels. Voor een beknopte, zullen we soms verwijzen naar primaire sleutels als 'key' of 'PK' in dit artikel, maar dit wordt altijd aanduiding 'primair Key'. Dubbele PKs zijn een schending van de integriteit van de entiteit, en moeten niet toegestaan in een relationeel systeem. SQL Server heeft verschillende mechanismen voor integriteit van de entiteit, inclusief indexen, UNIEKE beperkingen afdwingen Beperkingen voor primaire sleutels en triggers.

Ondanks deze ongebruikelijke omstandigheden kunnen dubbele primaire sleutels optreden, en als zodanig moet worden geëlimineerd. Één manier kan plaatsvinden wordt als dubbele PKs bestaat in niet-relationele gegevens buiten SQL Server en de gegevens geïmporteerd terwijl PK wordt niet wordt afgedwongen. Een andere manier plaatsvinden via een databasefout ontwerp, zoals de entiteit niet afdwingen de integriteit van elke tabel.

Vaak worden dubbele PKs opgemerkt wanneer u een unieke index maken welke wordt afgebroken als er dubbele sleutels zijn gevonden. Dit bericht is:
Msg 1505, 16, niveau 1 staat Unieke index afgebroken op dubbele sleutel maken.
Als u SQL Server 2000 of SQL Server 2005 gebruikt, wordt het volgende foutbericht weergegeven:
Msg 1505 niveau 16 staat 1 CREATE UNIQUE INDEX beëindigd omdat een dubbele sleutel is gevonden voor objectnaam ' %. * ls en de indexnaam van de ' %. * ls'. De dubbele waarde is % ls.
In dit artikel wordt beschreven hoe u zoeken en verwijderen van dubbele primaire sleutels uit een tabel. Echter, moet u nauw toegestaan proces onderzoeken de duplicaten te gebeuren om een herhaling te voorkomen.

Meer informatie

In dit voorbeeld we in de volgende tabel met dubbele PK waarden gebruiken. In deze tabel wordt de primaire sleutel in de twee kolommen (col1, col2). We kunnen niet Maak een unieke index of primaire-sleutelbeperkingen aangezien twee rijen dubbele PKs. Deze procedure laat zien hoe identificeren en verwijderen van de duplicaten.
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')
				
De eerste stap is om te bepalen welke rijen hebben dubbele primaire sleutelwaarden:
SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1
				
Dit retourneert één rij voor elke set dubbele PK-waarden in de tabel. De laatste kolom in het resultaat is het aantal dubbele records voor de bepaalde PK-waarde.

Deze tabel samenvouwenDeze tabel uitklappen
Kol1Kol2
112


Als er slechts een paar sets dubbele PK waarden, is de beste procedure deze op individuele basis handmatig verwijderen. Bijvoorbeeld:
set rowcount 1
delete from t1
where col1=1 and col2=1
				
De rowcount-waarde moet het aantal dubbele records voor een bepaalde waarde n-1. In dit voorbeeld zijn er 2 duplicaten zodat rowcount is ingesteld op 1. De waarden Kol1/Kol2 worden genomen uit de bovenstaande groep door resultaten. Als de query GROEPEREN op meerdere rijen, wordt de query 'set rowcount' eenmaal worden uitgevoerd voor elk van deze rijen hebben. Rowcount telkens wordt uitgevoerd, ingesteld op het aantal duplicaten van de bijzonder PK n-1.

Voordat u de rijen wilt verwijderen, moet u controleren of de gehele rij wordt dubbele. Hoewel onwaarschijnlijk, is het mogelijk dat de PK-waarden dubbele zijn, toch is de rij als geheel. Een voorbeeld hiervan is een tabel met Sofi-nummer als de primaire sleutel en met twee verschillende mensen (of rijen) met hetzelfde nummer dat elke unieke kenmerken. In dergelijke een geval dat de storing veroorzaakt dubbele sleutel kan ook veroorzaakt geldige unieke gegevens in de rij worden geplaatst. Deze gegevens moeten worden gekopieerd en voor studie en mogelijke aansluiting voor het verwijderen van de gegevens behouden.

Als er afzonderlijke sets dubbele PK-waarden in de tabel zijn, kunnen tijdrovend te afzonderlijk verwijderen. In dit geval de volgende procedure kan worden gebruikt:
  1. Voer eerst de bovenstaande groep door query om te bepalen hoeveel sets dubbele PK waarden bestaat en het aantal dubbele records voor elke set.
  2. Selecteer de dubbele sleutelwaarden in de tabel van een bedrijf. Bijvoorbeeld:
    SELECT col1, col2, col3=count(*)
    INTO holdkey
    FROM t1
    GROUP BY col1, col2
    HAVING count(*) > 1
    					
  3. Selecteer dubbele rijen in een tabel bedrijf elimineren van duplicaten in het proces. Bijvoorbeeld:
    SELECT DISTINCT t1.*
    INTO holddups
    FROM t1, holdkey
    WHERE t1.col1 = holdkey.col1
    AND t1.col2 = holdkey.col2
    					
  4. Op dit punt moet de tabel holddups unieke PKs, echter dit niet het geval als t1 dubbele PKs nog unieke rijen (bijvoorbeeld SSN hierboven). Controleer of elke sleutel in holddups uniek is en dat u geen dubbele sleutels nog unieke rijen. Als u moet dus hier stoppen en van de rijen afstemmen die u wilt behouden voor een bepaalde dubbele sleutelwaarde. Bijvoorbeeld: de query:
    SELECT col1, col2, count(*)
    FROM holddups
    GROUP BY col1, col2
    						
    aantal 1 voor elke rij weer. Indien Ja, gaat u verder met stap 5 hieronder. Zo Nee, u hebt dubbele sleutels nog unieke rijen en moet bepalen welke rijen op te slaan. Deze opheffing meestal een rij verwijderen of een nieuwe unieke waarde voor deze rij maken. Een van deze twee stappen nemen voor dergelijke dubbele PK in de tabel holddups.
  5. Dubbele rijen uit de oorspronkelijke tabel verwijderen. Bijvoorbeeld:
    DELETE t1
    FROM t1, holdkey
    WHERE t1.col1 = holdkey.col1
    AND t1.col2 = holdkey.col2
    					
  6. De unieke rijen in de oorspronkelijke tabel plaatsen. Bijvoorbeeld:
    INSERT t1 SELECT * FROM holddups
    					

Eigenschappen

Artikel ID: 139444 - Laatste beoordeling: donderdag 12 juli 2012 - Wijziging: 4.0
De informatie in dit artikel is van toepassing op:
  • 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
Trefwoorden: 
kbsqlsetup kbinfo kbusage kbmt KB139444 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende: 139444

Geef ons feedback

 

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