Duplicaten in Databases
Uit Yapf
Inhoud |
Hoe voorkom je dubbelen
Er zijn grofweg twee methoden, de goede en de foute. De foute is populair maar fout in elk opzicht waarin ik het uit kan drukken.
De juiste methode.
Databases kunnen zelf controleren op dubbele waardes, via een zogenaamde unique-constraint of unique-index. Hiermee kun je aangeven date een kolom, of een combinatie van kolommen, altijd een unieke waarde of combinatie van waardes moet bevatten. Komt er een INSERT of UPDATE query die een dubbele wil maken dan mislukt die query simpelweg.
De foute methode.
De voor de hand liggende maar foute methode is die van het vooraf selecteren of de waarde al bestaat. Als je een waarde kunt vinden voordat je hem invoert dan bestond hij dus al.
Dit is fout om twee redenen,.
- je voert een extra query *altijd* uit om een andere query af en toe uit te sparen.
- er zit tijd tussen het moment waarop je het record ophaalt en het moment waarop je de data wel of niet invoert. Ookal is dat meestal een paar milliseconden, dat *IS* tijd genoeg voor een ander proces om dat record in te voeren. Wanneer jij dan dat record alsnog probeert toe te voegen heb je een dubbele. De enige manier om dat te voorkomen is de hele tabel exclusief te locken zodat andere processen niet bij de tabel kunnen zolang jij ermee bezig bent, en dat is iets wat je niet wilt doen in een normale database handeling.
Hoe vind je dubbelen
SQL is een bikkel als het gaat om statistiek en het vinden van dubbele data is dus ook een peulenschil. Groupeer je query op datgene wat uniek moet zijn en tel hoeveel elementen elke groep heeft. Filter vervolgens alle groepen die meer dan één element hebben.
Bijvoorbeeld, in een voorraad beheer mag elk productnummer maar één keer voorkomen omdat je van elk product maar één voorraad wilt hebben.
Voorraad: productnummer integer aantal_stuks integer
SELECT productnummer , COUNT(*) AS aantal_keer_gevonden FROM voorraad GROUP BY productnummer HAVING COUNT(*) > 1
De HAVING filtert hier de uitkomst van de GROUP BY zodat alleen productnummers die meer dan 1x voorkomen worden getoond. De virtuele kolom aantal_keer_gevonden geeft aan hoevaak het productnummer in de tabel voorkomt (niet te verwarren met het aantal sukts voorraad!)