Unieke waarden.

Status
Niet open voor verdere reacties.

ErikBooy007

Terugkerende gebruiker
Lid geworden
24 mei 2007
Berichten
3.814
Goedemiddag!

Ik ben op het moment bezig met een project waarin ik weerberichten opsla in een database. Het gaat hierbij om luchtvaartweerberichten, zogenaamde METAR's.

Op zich geen probleem. Het punt is alleen, ik run een cronjob regelmatig, zodat het weer gedownload wordt en ingevoerd in de database. Het script haalt dan de weerberichten van de afgelopen 36 uur op. Dat script run ik elke 24 uur. Dan heb ik dus een redelijke overlap, maar weet ik zeker dat ik geen weerbericht mis.

Om te voorkomen dat de weerberichten meerdere keren in de database komen, heb ik een UNIQUE constraint gezet op de combinatie weerstation en tijd/datum.

Ik voer alle nieuwe weerberichten van een station in één query in (de nieuwste eerst en de oudste als laatste). Wat is nu het probleem? De nieuwe records komen wel in de DB, maar de query stopt bij een duplicate en daardoor kan ik met de PHP-functie mysql_affected_rows niet het aantal toevoegingen opvragen. Die functie returned namelijk "-1" (query failed).

Mijn vraag is nu: heeft iemand voor jullie een oplossing voor dit probleem? Mijn kennis van MySQL is niet fantastisch en misschien zit ik helemaal niet in de goede richting met die UNIQUE enzo.

Bij voorbaat dank!
 
Laatst bewerkt:
Je zou de syntax "INSERT ... ON DUPLICATE KEY UPDATE" kunnen proberen. Ik weet niet hoe de PHP-functie daarop gaat reageren (of het als affected row wordt gezien), maar je krijgt in ieder geval geen "query failed" terug.
 
Je bent echt een held (oh nee, dat was de baas ;))!! :D

Of ie als affected row gezien wordt weet ik niet. Aangezien de andere velden nooit kunnen verschillen bij een gelijke key, wordt er nooit daadwerkelijk geupdate (ik hoop dat je begrijpt wat ik met deze kromme zin bedoel).

In ieder geval krijg ik nu het aantal toegevoegde records netjes terug.

Vraag opgelost!
 
Bij nader inzien, dat werkte niet :confused: Bleek dat ik iets te makkelijk dacht en dat er niets meer achter UPDATE hoefde (m'n error handling was niet in orde ;)). Nu heb ik het opgelost door er STATION = STATION achter te zetten (STATION is een veld), aangezien er niets moet veranderen.

Tijdens de zoektocht naar mijn fout kwam ik echt ook nog "INSERT IGNORE... " tegen. Dat doet ook eigenlijk wel wat ik wil? Is er nog een reden om dat niet te gebruiken, of kan dat eigenlijk net zo goed als ON DUPLICATE?
 
INSERT IGNORE is misschien nog wel beter, die voegt alleen de nieuwe rijen toe en doet niks met keys die al bestaan. Die telt dus ook niet de rijen die genegeerd worden.

Een misschien nog makkelijkere oplossing is om de rijen een voor een toe te voegen, dan hoef je helemaal niet moeilijk te doen met queries.
 
Ik meende dat de rijen één voor een toevoegen performance-wise juist niet slim was, daarom drukte ik ze allemaal in één query.

Maar met de IGNORE doet ie in ieder geval wat ik wil :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan