✦ Oplossingen · Database (MySQL/MariaDB)

MySQL: Duplicate entry for key 'PRIMARY' (fout 1062)

'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.

Waarom gebeurt dit?

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.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Bekijk welke sleutel en waarde

    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;
  2. Controleer de auto_increment-teller

    Vergelijk de volgende waarde met het hoogste id in de tabel.

    SELECT MAX(id) FROM bestellingen;
    SHOW TABLE STATUS LIKE 'bestellingen';  -- kolom Auto_increment
  3. Zet de teller goed

    Staat de teller lager dan of gelijk aan het hoogste id, zet hem dan erboven.

    ALTER TABLE bestellingen AUTO_INCREMENT = 1544;
  4. Vang echte dubbele invoer netjes op

    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);

Lukt het niet? Wij helpen

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.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Mag ik de UNIQUE-index gewoon weghalen?

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 fout komt bij het importeren van een back-up.

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.

Waarom loopt de teller achter?

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).