MySQL: duplicate entry, mais je ne vois pas où...

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
Répondre
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

MySQL: duplicate entry, mais je ne vois pas où...

Message par Ymai »

Bonjour
Je reste tout bête devant la requête suivante qui devrait me permettre de reconstituer une table.
La clef primaire est sur le champ "idretenue" qui s'auto-incrémente. Le reste ne pose, je pense, guère de problème.
Lorsque je lance la requête sous PHPMyAdmin:

Code : Tout sélectionner

 CREATE TABLE `ades_retenues` (
  `typeDeRetenue` tinyint(4) NOT NULL default '0',
  `idretenue` int(11) NOT NULL auto_increment,
  `ladate` date NOT NULL default '0000-00-00',
  `heure` varchar(5) collate utf8_unicode_ci NOT NULL default '',
  `duree` tinyint(4) NOT NULL default '1',
  `local` varchar(30) collate utf8_unicode_ci NOT NULL default '',
  `places` tinyint(4) NOT NULL default '0',
  `occupation` tinyint(4) NOT NULL default '0',
  `affiche` enum('O','N') collate utf8_unicode_ci NOT NULL default 'O',
  PRIMARY KEY  (`idretenue`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
 
INSERT INTO ades_retenues VALUES ('2','2','2007-09-12','13h30','2','Salle d''étude','20','1','N');
INSERT INTO ades_retenues VALUES ('2','4','2007-09-19','13h30','2','Salle d''étude','20','1','N');
INSERT INTO ades_retenues VALUES ('1','5','2007-09-06','15h30','1','Salle d''étude','20','1','N');
INSERT INTO ades_retenues VALUES ('1','6','2007-09-10','15h30','1','Salle d''étude','20','1','N');
INSERT INTO ades_retenues VALUES ('2','7','2007-09-26','13h30','2','Salle d''étude','20','1','O');
INSERT INTO ades_retenues VALUES ('1','9','2007-09-11','15h30','1','Salle d''étude','20','0','N');
INSERT INTO ades_retenues VALUES ('2','0','2007-10-10','13h30','2','Salle d''étude','20','0','O');
INSERT INTO ades_retenues VALUES ('1','10','2007-09-13','15h30','1','Salle d''étude','20','0','N');
J'obtiens le message d'erreur suivant sur la dernière insertion.
Message d'erreur:

Code : Tout sélectionner

INSERT INTO ades_retenues
VALUES (
'1', '10', '2007-09-13', '15h30', '1', 'Salle d''étude', '20', '0', 'N'
);
MySQL a répondu:Documentation
#1062 - Duplicate entry '10' for key 1 
En fait, ma requête d'insertion est beaucoup plus longue. Mais si je supprime la ligne qui fait problème ci-dessus, j'insère beacoup plus de lignes sans souci.
Ne voyant aucun autre enregistrement avec un champ "idretenue" = 10, je ne vois pas où se trouve la "Duplicate entry".
Quelqu'un pourrait me mettre sur la piste?
Merci pour toute réponse.

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.12) Gecko/20070530 Fedora/1.5.0.12-1.fc5 Firefox/1.5.0.12
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

C'est ton

Code : Tout sélectionner

INSERT INTO ades_retenues VALUES ('2','0','2007-10-10','13h30','2','Salle d''étude','20','0','O'); 
Qui insert la valeur 10 au lieu de 0... ça a probablement à voir avec l'AutoIncrement... (la valeur précédente insérée vaut 9, en voyant 0 il mets 10, du coup tu as déjà un 10)

Deux possibilités : soit tu vires l'auto-increment, qui n'est pas nécessaire dans cet exemple vu que tu donnes toujours les valeurs pour la clé, soit tu utilise "Default"

Code : Tout sélectionner

INSERT INTO ades_retenues VALUES ('2', DEFAULT, '2007-10-10', '13h30', '2', 'Salle d''étude', '20', '0', 'O'); 
Si tu as absolument besoin de l'auto-increment après le peuplement de la base, tu peux le rajouter avec ALTER TABLE, mais là aussi de nouveau attention aux comportements bizarre :wink:

PS : ce sont des entiers, pas besoin de les mettre entre quote...
[Edit] Ce n'est pas un problème spécifique à phpMyAdmin mais à MySQL.
Dernière modification par calimo le 02 oct. 2007, 13:18, modifié 1 fois.
teoli2003
Animal mythique
Messages : 7580
Inscription : 13 nov. 2005, 09:23

Message par teoli2003 »

De plus je ne sais pas si c'est bon de mettre des ' pour les valeurs entières. La conversion risque de donner des résultats bizarres (genre '10' considéré comme 1...).

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr-FR; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
La liberté n'est jamais accordée de bon gré par l'oppresseur; elle doit être exigée par l'opprimé (Martin Luther King).
Les convictions sont des ennemis de la vérité plus dangereux que les mensonges. (Nietzsche).
Native Mozillian.
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

[Résolu] MySQL: duplicate entry, mais je ne vois pas où...

Message par Ymai »

Merci de te pencher sur mon problème
calimo a écrit :C'est ton

Code : Tout sélectionner

INSERT INTO ades_retenues VALUES ('2','0','2007-10-10','13h30','2','Salle d''étude','20','0','O'); 
Qui insert la valeur 10 au lieu de 0... ça a probablement à voir avec l'AutoIncrement... (la valeur précédente insérée vaut 9, en voyant 0 il mets 10, du coup tu as déjà un 10)
Astucieux...
Deux possibilités : soit tu vires l'auto-increment, qui n'est pas nécessaire dans cet exemple vu que tu donnes toujours les valeurs pour la clé,
Effectivement, je n'en ai pas besoin de manière explicite ici. Mais c'est un dump d'une base de données que je dois remettre en place. Donc, les valeurs de la clé sont importantes: elles font référence à une autre table.
J'ai essayé de virer le auto_increment le temps de l'importation. Mais il me fait la même erreur si je remets auto_increment a posteriori.
La question revient donc à se demander comment réintégrer un dump d'une table contenant un auto_increment. La question du débutant, quoi...
soit tu utilise "Default"

Code : Tout sélectionner

INSERT INTO ades_retenues VALUES ('2', DEFAULT, '2007-10-10', '13h30', '2', 'Salle d''étude', '20', '0', 'O'); 
Comme je le disais ci-dessus, non praticable
Si tu as absolument besoin de l'auto-increment après le peuplement de la base, tu peux le rajouter avec ALTER TABLE, mais là aussi de nouveau attention aux comportements bizarre :wink:

PS : ce sont des entiers, pas besoin de les mettre entre quote...
[Edit] Ce n'est pas un problème spécifique à phpMyAdmin mais à MySQL.
Exact. Les quotes proviennent de ma procédure de dump qui ne fait pas le détail entre les types de données. C'est un problème que des entiers soient quotés? Il me semble que l'importation se passe tout à fait bien pour toutes mes autres tables où la même "norme" est appliquée.

[edit]Bon, je viens de tester la solution suivante:
Je rétablis l'ordre logique des lignes et je place en premier la ligne
INSERT INTO ades_retenues VALUES ('2','0','2007-10-10','13h30','2','Salle d''étude','20','0','O');
Et l'importation se fait correctement.
Conclusion: j'ai un utilisateur qui a chipoté manuellement les valeurs dans la table et modifié l'id de l'enregistrement manuellement. Comment l'enregistrement '0' pourrait-il se trouver en position '10', sinon?
Merci Calimo de m'avoir mis la puce à l'oreille sur ce point.[/edit]
Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.8.0.12) Gecko/20070530 Fedora/1.5.0.12-1.fc5 Firefox/1.5.0.12
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Re: [Résolu] MySQL: duplicate entry, mais je ne vois pas o

Message par calimo »

Ymai a écrit :Comment l'enregistrement '0' pourrait-il se trouver en position '10', sinon?
Tant que tu ne fais pas un "ORDER BY" les enregistrements ne sont pas censés sortir dans un ordre spécifique... donc ça ne me semble pas anormal :wink:
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Ils sont pourtant bien créés dans l'ordre numérique: d'abord le 0 et le 10 bien après.
La table n'étant jamais ré-ordonnées par mon application.
L'état dans lequel je la trouve dans mon dump, tout frais non retravaillé, est forcément le reflet de son état sur le serveur.
J'ai encore de la marge de progression sur la compréhension de MySQL.

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Ymai a écrit :Ils sont pourtant bien créés dans l'ordre numérique: d'abord le 0 et le 10 bien après.
La table n'étant jamais ré-ordonnées par mon application.
L'état dans lequel je la trouve dans mon dump, tout frais non retravaillé, est forcément le reflet de son état sur le serveur.
L'ordre de stockage n'est pas nécessairement l'ordre de création... et l'ordre de sortie n'est pas nécessairement l'ordre de stockage...
Même s'il peut parfois y avoir un peu de ça, ce n'est certainement pas une règle absolue :wink: (un peu comme les tableaux associatifs (hash) dans certains langages... les clés ne sont pas dans l'ordre)
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Ca, c'est vraiment ennuyeux. La réinjection d'un dump risque de poser des problèmes à tous les coups.

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Message par Benoit »

Normalement les outils d'importation devraient être prévus pour faire tout en une seule transaction pour éviter les problèmes avec les contraintes. Dans ce cas-ci : l'auto-increment pourrait n'être activé qu'à la fin. Dans le cas contraire, change la définition de la table manuellement avant de faire l'import et puis remets-la comme avant.

Sinon, oui, le SQL est une notation ensembliste, donc il n'y a pas d'ordre à moins de le demander explicitement.
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
Ymai
Tyrannosaurus Rex
Messages : 4220
Inscription : 12 mars 2005, 11:36

Message par Ymai »

Conclusion:
- réinjecter sans auto-increment
- trier la table sur son id
- réactiver l'auto-increment
Et voilà.

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)
ymai
« Un enfant de cinq ans comprendrait cela ! Allez me chercher un enfant de cinq ans ! »
Groucho Marx.
Quentin1983

Message par Quentin1983 »

Bonjour,

je me permets d'ecrire sur ce post parce que je pense avoir le même PB mais je n'y comprend pas grand chose :oops: ...

je vais essayé de m'expliquer :roll:

historique :

J'avais créé un forum qui fonctionnait normalement. J'ai voulu changer de place (une autre url) le repertoire de stockage du forum. Donc j'ai créé une sauvegarde de la base à partir du panneau de config du forum (phpbb_db_backup.sql). J'ai ensuite tout supprimer (dossiers + db)...

J'ai réinstallé le forum sur une autre url, et j'ai voulu charger ma sauvegarde... et là c'est le drame :shock: !

Voici ce que j'obtiens avec BigDump :

Code : Tout sélectionner

Traitement de fichier: phpbb_db_backup.sql

Commencer à la ligne: 21030

Erreur à la ligne 21781: INSERT INTO phpbb_search_wordlist (word_text, word_id, word_common) VALUES('der', '320', '0');

Query: INSERT INTO phpbb_search_wordlist (word_text, word_id, word_common) VALUES('der', '320', '0');

MySQL: Duplicate entry 'der' for key 1

Arrêter sur Erreur
Pouvez vous m'aider :roll:

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
Quentin1983bis

Message par Quentin1983bis »

j'oubliais...

l'adresse actuelle du forum :

http://s153825559.onlinehome.fr/forum/index.php

(la liste des membres est vide, les sujets ont disparus...)

encore merci d'avance :roll:

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message par calimo »

Visiblement, l'entrée "der" a déjà été insérée... comme ce n'est certainement pas vital (visiblement ça a à voir avec la recherche), tu peux essayer de reprendre l'insertion à la ligne 21031... :wink:

Message envoyé avec : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firerenard Firefox/2.0.0.6 (Ubuntu-feisty)

PS : au niveau de MySQL, qui n'est pas très "strict" (pas assez visiblement, j'ai aussi eu des soucis de ce genre), le mieux c'est probablement de récupérer les fichiers binaires de la base... si c'est possible bien entendu !
Quentin1983

Message par Quentin1983 »

Merci mais qu'est ce qu'il faut faire exactement et ou ça :shock: :roll:

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 6 invités