Dans le cadre de la migration des données d’une structure de base à une autre, j’ai été confronté à un petit problème. En effet, dans l’ancienne version de la BDD, certaines tables de paramètres ont un id démarrant à 0 au lieu de 1.
Exemple :
Id | Valeur |
---|---|
0 | Non communiqué |
1 | Féminin |
2 | Masculin |
Or, lorsque je lance la requête :
INSERT INTO `civilite_new` (`civilite_new_id`, `civilite_new_label`) SELECT `civilite_id`, `civilite_label` FROM `civilite`;
MySQL me retourne l’erreur suivante :
Error Code: 1062. Duplicate entry '1' for key 'PRIMARY'
L’AUTO_INCREMENT prend la première ligne (Id = 0) et force l’Id à 1. Du coup, lors du traitement de la deuxième ligne, MySQL bloque car la valeur de l’Id de cette dernière est également 1. Partant de ce constat, deux solutions sont possibles :
- ré-incrémenter toutes les tables en décalant les id (on aurait donc 1, 2, 3 à la place de 0, 1, 2) – Attention aux intégrités référentielles
- forcer la valeur 0 du premier Id – pas très « propre » mais efficace
Dans mon cas, la première solution ne me convient pas car le code de l’application qui alimente cette base de données repose sur le principe de Id = 0 pour « Non communiqué ».
Donc, pour forcer la mise à 0 des premiers Id, il va donc falloir user du mode SQL NO_AUTO_VALUE_ON_ZERO :
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO';
Ajoutez la ligne ci-dessus avant votre INSERT ou UPDATE.
Une fois vos requêtes exécutées, n’oubliez pas de désactiver le mode « NO_AUTO_VALUE_ON_ZERO » :
SET SQL_MODE=@OLD_SQL_MODE;
Et le tour est joué ! ^^