Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/04/2004, 17h55   #1
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 56
Points : 31
Points : 31
Par défaut #1062 - Duplicate entry

Serveur : 3.23.58
PHP : 4.3.3
bdd : mabase
table : menu

Bonjour,
je débute avec MySQL et j'ai un petit souci.
Je souhaites créer une table à l'aide d'une requête SQL, mais le serveur me renvoit une erreur :

Code :
1
2
3
4
5
6
Erreur
requête SQL :  
INSERT INTO `menu` 
VALUES ( 128, 'Promotion de litalien - italie collège', 'http://site.voila.fr/italienlangueculture/litalie.htm', 'europ', 0, '0', 0 ) 
MySQL a répondu:
#1062 - Duplicate entry '127' for key 1
Je dois comprendre qu'il y a une valeur en double :

Ci-dessous la requête complète :
----------------------------------------------------

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# requête SQL
#
CREATE TABLE `menu` (
  `m_id` tinyint(4) NOT NULL AUTO_INCREMENT,
  `m_titre` varchar(100) NOT NULL DEFAULT '',
  `m_lien` varchar(100) NOT NULL DEFAULT '',
  `m_m1` varchar(30) NOT NULL DEFAULT '0',
  `m_t1` tinyint(4) NOT NULL DEFAULT '0',
  `m_m2` varchar(30) NOT NULL DEFAULT '0',
  `m_t2` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY  (`m_id`)
) TYPE=MyISAM AUTO_INCREMENT=159 ;
#
# contenu de la table 'menu'
#
INSERT INTO `menu` VALUES (1, 'Brevet', 'http://www.ac-poitier.fr/italien/exinter/xbrevet.htm', 'annales', 1, '0', 0);
...
[Code édité par Maximilian]
[
234 lignes de code supprimées ]
Spaccio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2004, 18h40   #2
Candidat au titre de Membre du Club
 
Inscription : mars 2004
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 60
Points : 13
Points : 13
J'avoue que le problème me semble étrange... et si tu introduis réllement "128", il est effectivement bizarre que le message d'erreur mentionne "127".


Est-ce la seule insertion ou tu rencontres un problème? As-tu réussi à introduire des menus avec un m_id plus élevé?



Mais ce qui m'interpelle particulièrement, c'est que j'ai l'impression qu'à chaqe fois le numéro de m_id est inséré alors qu'il est sensé être auto-incrément.

Les cas ou une primary key auto-incrépentée doit être introduite sont assez rare.
Si j'étais toi, je ne le préciserais pas lors de l'insertion, et alors tu ne rencontrerais pas de problème théoriquement. Ou alors, je changerais le type de ma clef primaire pour qu'elle ne soit pas auto-incrémentée.

Maintenant, il est possible qu'il y ait une raison cachée à cela, et si c'est le cas, oublions ce que j'ai écrit...
Drag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2004, 19h44   #3
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 56
Points : 31
Points : 31
Par défaut #1062 suite

Merci DRAG pour tes idées ; j'ai éssayé pas mal de chose dans le même genre. Ne pas spécifier les entrées de la clef primaire (m_id) puisqu'elles sont auto-incrémentées, mais cela provoque une erreur #1064 (je les collectionne décidément) puisqu'il manque une valeur sur un champ NOTNULL.
Le vrai problème n'est pas là, c'est que je ne parviens pas à cerner d'où vient le problème, si c'est la requête qui comporte un erreur, si c'est la table qui n'est pas correcte ou autre chose que j'ignore.
J'usqu'à présent je me contentais de faire de petite table pour tester mes scripts PHP, je n'ai donc pas réalisé une table plus importante.

merci pour la réponse
Spaccio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2004, 20h34   #4
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 56
Points : 31
Points : 31
Par défaut #1062 suite et fin

Bon j'ai trouvé une solution à mon problème :

Il suffit de changer la taille du champ (m_id) qui sert de clef primaire (auto-increment); le passer de TINYINT à INT :

Code :
1
2
3
4
5
6
7
8
9
10
CREATE TABLE `menu` ( 
`m_id` int(11) NOT NULL AUTO_INCREMENT, 
`m_titre` varchar(100) NOT NULL DEFAULT '', 
`m_lien` varchar(100) NOT NULL DEFAULT '', 
`m_m1` varchar(30) NOT NULL DEFAULT '0', 
`m_t1` tinyint(4) NOT NULL DEFAULT '0', 
`m_m2` varchar(30) NOT NULL DEFAULT '0', 
`m_t2` tinyint(4) NOT NULL DEFAULT '0', 
PRIMARY KEY (`m_id`) 
) TYPE=MyISAM AUTO_INCREMENT=160 ;
Bon je suis pas assez calé pour expliquer clairement le problème, mais je dirai qu'il était question d'une autorisation de codage sur une plage numérique devenu trop petite. En passant du TINYINT (1 octet) à INT (4 octets) ça marche.
Si un expert peut nous donner une ecplication plus claire, elle sera bien venu
Spaccio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2004, 11h43   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2004
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 60
Points : 13
Points : 13
Bah, en fait, vu comme cela, l'explication est très simple Je n'avais pas remarqué que c'était un tinyint (alors que je te demandais pourtant si tu pouvais insérer des valeurs plus grandes. Je ne dois pas être très logique des fois. )


tinyint est stocké sur un octet, soit 8 bits.

Cela te permet d'avoir ( 2 exposant 8 ) valeurs, soit 256 valeurs.

N'ayant pas précisé que ta valeur ne peut être que positive, tu perds un peu de mémoire, et au lieu de pouvoir aller de 0 à 255, tu ne pouvais aller que de
-128 à 127. Il était donc logique que ton insertion pose un problème à partir du 128.


Par contre je maintiens qu'il n'est pas logique de devoir insérer le numéro de menu alors que tu es en auto-incrémenté!
Si j'étais toi, je préfèrerais même permettre à ce champ d'être null, de toute facon il se remplira obligatoirement seul (mais normalement, même sans permettre le null, ce devrait fonctionner).
Parcequ'avoir un champ auto-incrémenté que l'on rempli à chaque fois soi-même, ce n'est pas très cohérent...


J'avoue que je ne sais pas ce qu'est sensé faire le "AUTO_INCREMENT=160"...peut-être que cela a une influence...

[édité pour cause de smiley involontaire. Celui-ci d'ailleurs: 8) ]
Drag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2004, 15h35   #6
Nouveau Membre du Club
 
Inscription : avril 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 56
Points : 31
Points : 31
Je peux pas te dire Drag si c'est cohérent, en tout cas c'est le SQL exporter depuis MySQL pour sauvegarder les données. Ensuite quand j'ajoute de nouvelles valeurs soit par script PHP, soit directement via MySQL, l'auto-incrément fonctionne normalement, c'est à dire que je ne précise pas la valeur auto-incrémentée.
Spaccio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2004, 11h18   #7
Invité de passage
 
Inscription : juin 2004
Messages : 1
Détails du profil
Informations forums :
Inscription : juin 2004
Messages : 1
Points : 1
Points : 1
Par défaut Duplicate entry '127' for key 3

changer tinyint to int.
bonne chance
elmb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h17.


 
 
 
 
Partenaires

Hébergement Web