'ERROR 1062: Duplicate entry '…' for key 'PRIMARY'' betekent dat een waarde al bestaat in een unieke kolom. Vaak een auto_increment die achterloopt na een import of een dubbele insert.
Een primaire sleutel of een UNIQUE-index staat geen twee gelijke waarden toe. Voeg je een rij toe met een waarde die al bestaat, dan weigert de server met fout 1062 en noemt hij de waarde en de sleutel.
Bij een auto_increment-kolom is de oorzaak vaak een teller die achterloopt, bijvoorbeeld na een gedeeltelijke import of het handmatig invoegen van rijen met een id. Bij andere unieke kolommen (e-mailadres, ordernummer) gaat het om echte dubbele invoer, bijvoorbeeld een formulier dat twee keer wordt verzonden.
Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.
De melding noemt de sleutel ('PRIMARY' of de naam van een UNIQUE-index) en de waarde. Zoek de bestaande rij op.
SELECT * FROM bestellingen WHERE id = 1543;Vergelijk de volgende waarde met het hoogste id in de tabel.
SELECT MAX(id) FROM bestellingen;
SHOW TABLE STATUS LIKE 'bestellingen'; -- kolom Auto_incrementStaat de teller lager dan of gelijk aan het hoogste id, zet hem dan erboven.
ALTER TABLE bestellingen AUTO_INCREMENT = 1544;Moet een bestaande rij worden bijgewerkt in plaats van opnieuw ingevoegd, gebruik dan ON DUPLICATE KEY UPDATE. Voorkom ook dubbel verzenden van formulieren (knop uitschakelen na klikken, redirect na POST).
INSERT INTO nieuwsbrief (email, naam) VALUES ('a@voorbeeld.nl', 'An')
ON DUPLICATE KEY UPDATE naam = VALUES(naam);Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.
Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.
Alleen als de waarde echt niet uniek hoeft te zijn. Een index die dubbele bestellingen of accounts tegenhoudt, staat er meestal met een reden.
De doeltabel bevat al gegevens. Importeer in een lege database of tabel, of gebruik in de dump INSERT IGNORE / REPLACE als je zeker weet wat je doet.
Bijvoorbeeld door een import met vaste id's of door een gedeeltelijk teruggezette tabel. In oudere MySQL-versies werd de teller ook na een herstart opnieuw bepaald uit MAX(id).
Hulp nodig van een mens? Website-onderhoud · WordPress-support · Hosting en onderhoud · Alle oplossingen