Dubbele rijen verwijderen uit een tabel in SQL Server

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
Samenvatting
Microsoft SQL Server-tabellen mag nooit dubbele rijen bevatten, nochniet-unieke primaire sleutels. Voor een beknopte, zullen we soms verwijzen naar primairesleutels als 'key' of 'PK' in dit artikel, maar dit wordt altijd aanduiding 'primairKey'. Dubbele PKs zijn een schending van de integriteit van de entiteit, en moetenniet toegestaan in een relationeel systeem. SQL Server heeft verschillende mechanismen voorintegriteit van de entiteit, inclusief indexen, UNIEKE beperkingen afdwingenBeperkingen 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 dubbelePKs bestaat in niet-relationele gegevens buiten SQL Server en de gegevensgeïmporteerd terwijl PK wordt niet wordt afgedwongen. Een andere manierplaatsvinden via een databasefout ontwerp, zoals de entiteit niet afdwingende integriteit van elke tabel.

Vaak worden dubbele PKs opgemerkt wanneer u een unieke index makenwelke wordt afgebroken als er dubbele sleutels zijn gevonden. Dit bericht is:
Msg 1505, 16, niveau 1 staatUnieke 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 uiteen tabel. Echter, moet u nauw toegestaan proces onderzoeken deduplicaten 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 nietMaak een unieke index of primaire-sleutelbeperkingen aangezien twee rijendubbele PKs. Deze procedure laat zien hoe identificeren en verwijderen van deduplicaten.
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 t1GROUP BY col1, col2HAVING 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 debepaalde PK-waarde.

Kol1Kol2
112


Als er slechts een paar sets dubbele PK waarden, is de beste proceduredeze op individuele basis handmatig verwijderen. Bijvoorbeeld:
set rowcount 1delete from t1where 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 wordtdubbele. Hoewel onwaarschijnlijk, is het mogelijk dat de PK-waarden dubbele zijn,toch is de rij als geheel. Een voorbeeld hiervan is een tabel metSofi-nummer als de primaire sleutel en met twee verschillende mensen(of rijen) met hetzelfde nummer dat elke unieke kenmerken. In dergelijkeeen geval dat de storing veroorzaakt dubbele sleutel kan ook veroorzaaktgeldige unieke gegevens in de rij worden geplaatst. Deze gegevens moeten worden gekopieerd envoor studie en mogelijke aansluiting voor het verwijderen van de gegevens behouden.

Als er afzonderlijke sets dubbele PK-waarden in de tabel zijn, kunnentijdrovend te afzonderlijk verwijderen. In dit geval devolgende 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 holdkeyFROM t1GROUP BY col1, col2HAVING count(*) > 1					
  3. Selecteer dubbele rijen in een tabel bedrijf elimineren van duplicaten in het proces. Bijvoorbeeld:
    SELECT DISTINCT t1.*INTO holddupsFROM t1, holdkeyWHERE t1.col1 = holdkey.col1AND 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 holddupsGROUP 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 t1FROM t1, holdkeyWHERE t1.col1 = holdkey.col1AND t1.col2 = holdkey.col2					
  6. De unieke rijen in de oorspronkelijke tabel plaatsen. Bijvoorbeeld:
    INSERT t1 SELECT * FROM holddups					
sql6 dedupe intg entiteit

Waarschuwing: dit artikel is automatisch vertaald

Eigenschappen

Artikel-id: 139444 - Laatst bijgewerkt: 07/12/2012 13:08:00 - Revisie: 4.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 KbMtnl
Feedback