La base refuse d’enregistrer une ligne parce que sa clé existe déjà : chaque article, chaque métadonnée, chaque option doit avoir un identifiant unique. Avec « Duplicate entry ‘0’ for key ‘PRIMARY’ », un cas classique, les tables ont perdu leur numérotation automatique, souvent après une migration, et chaque nouvel ajout reçoit l’identifiant 0.
Pourquoi cette erreur apparaît
- Après une migration ou un import, les colonnes d’identifiant ont perdu leur numérotation automatique (AUTO_INCREMENT) ou leur clé primaire.
- Une base importée deux fois, ou par-dessus des données existantes, contient déjà les lignes que l’import tente d’ajouter.
- Deux traitements simultanés, comme deux tâches planifiées, créent la même option au même instant.
- Une extension insère ses données sans vérifier qu’elles existent déjà.
Comment corriger le problème
Repérer la table et la clé
Le message donne la valeur en double et la clé concernée, et la requête qui suit (INSERT INTO wp_posts, wp_postmeta, wp_options…) nomme la table. Une valeur 0 sur la clé PRIMARY oriente vers une numérotation perdue ; un nom d’option en double sur option_name, vers deux écritures simultanées, le plus souvent sans conséquence.
Vérifier si le blocage se répète
Essayez de créer un brouillon ou d’ajouter un produit. Si l’enregistrement échoue à chaque fois, la structure de la base est en cause ; si le message n’apparaît qu’à l’occasion dans le journal, il s’agit plutôt d’une collision ponctuelle.
Sauvegarder puis examiner la structure
Exportez la base, puis affichez dans l’onglet SQL de phpMyAdmin la définition de la table citée. La colonne d’identifiant (ID, meta_id, option_id…) doit porter la mention AUTO_INCREMENT, et la table une PRIMARY KEY sur cette colonne.
SHOW CREATE TABLE wp_posts;
Rétablir la numérotation automatique
Si AUTO_INCREMENT a disparu, il doit être rétabli table par table, après avoir traité les lignes enregistrées avec l’identifiant 0, auxquelles d’autres données ont pu se rattacher. Si la clé primaire manque aussi, elle doit être ajoutée avant. C’est une opération délicate : faites-la d’abord sur une copie du site. Exemple pour la table des articles, une fois la ligne 0 traitée :
ALTER TABLE wp_posts MODIFY ID bigint unsigned NOT NULL AUTO_INCREMENT;
Exportez la base complète avant toute requête SQL, et testez les changements de structure sur une copie du site avant de les appliquer en ligne.
Un autre message d'erreur ? Collez-le dans le décodeur : il le reconnaît et vous oriente vers la bonne fiche.
Ouvrir le décodeur