FAQ MySQLConsultez toutes les FAQ

Nombre d'auteurs : 16, nombre de questions : 155, dernière mise à jour : 22 avril 2014  Ajouter une question

 

Cette FAQ a été conçue à partir des questions fréquemment posées sur le forum MySQL de Developpez.com. Elle ne prétend pas à être exhaustive et peut contenir des erreurs occasionnelles. Si vous relevez une coquille, n'hésitez pas à nous le faire savoir.

Pour participer à cette FAQ, veuillez envoyer vos réponses sur le forum.


SommaireSyntaxe SQL et structure des donnéesChamps auto-incrémentés (9)
précédent sommaire suivant
 

L'erreur classique consiste à vouloir deviner avant l'insertion quel numéro va être attribué. Or, dès qu'il y a plusieurs utilisateurs, cela laisse la porte ouverte à des conflits. (voir Peut-on utiliser MAX(ID) + 1)

La bonne façon de faire est d'insérer les données sans préciser de valeur pour la clef auto-incrémentée (voir cette question), et, au besoin, de récupérer immédiatement après la valeur attribuée par MySQL, soit en SQL avec la fonction LAST_INSERT_ID(), soit en PHP (ou autre utilisation de l'API C) avec la fonction mysql_insert_id().

Mis à jour le 9 octobre 2010 Antoun

Normalement rien, ce qui signifie qu'il ne faut pas citer la colonne dans la syntaxe d'insertion.

Par exemple, avec une table MaTable(ID, Val), dont le champ ID est auto-incrémenté, la syntaxe est :

Code sql : Sélectionner tout
1
2
INSERT INTO MaTable (Val) 
VALUES (...)
Si vous tenez à utiliser INSERT INTO MaTable VALUES (...) sans préciser les noms de colonnes, insérez DEFAULT :

Code sql : Sélectionner tout
1
2
INSERT INTO MaTable 
VALUES (DEFAULT, ...)
Il est possible d'insérer des valeurs entières positives dans un champ auto-incrémenté, aussi longtemps que vous n'enfreignez pas les règles d'index sur ce champ.

L'insertion de valeurs négatives est fortement déconseillée.

Mis à jour le 16 juin 2004 ced Florian

Pour récupérer le nombre généré dans un champ AUTO_INCREMENT par une requête INSERT, on peut utiliser les méthodes suivantes :

  • En SQL, la fonction LAST_INSERT_ID()
  • avec l'API C pour MySQL (celle utilisée entre autres par PHP), la fonction mysql_insert_id()

Dans les deux cas, la fonction renvoie le dernier numéro automatique attribué au cours de la session. Il n'y a donc pas de risque de conflit avec une session concurrent. Par contre, il convient de récupérer ce numéro immédiatement après l'INSERT.

Mis à jour le 16 juin 2004 Antoun Florian

Quand on utilise des tables ISAM ou BDB, MySQL réutilise les valeurs dans les colonnes de type AUTO_INCREMENT.

Ce qui veut dire que si vous supprimez une ou plusieurs lignes qui contiennent les valeurs maximum de la colonne auto-incrémenté, le compteur reprendra à la "valeur maximum restante"+1.

Avec des tables MyISAM ou InnoDB, MySQL ne réutilisera pas les valeurs.

Mis à jour le 16 juin 2004 Florian

Dans les versions les plus récentes de MySQL, vous pouvez préciser AUTO_INCREMENT=n comme option pour une table. Ceci indiquera à MySQL d'utiliser "n" comme valeur initiale. Toutes les nouvelles lignes augmenteront le compteur de 1, comme d'habitude. Cette valeur est perdue si vous supprimez toutes les lignes de la table.

Dans les versions plus anciennes, vous devez insérer une ligne "factice" dans votre table, si vous voulez être sûr que la table commence à s'incrémenter depuis une valeur précise.

Quelle que soit la méthode choisie, n'utilisez jamais une valeur négative comme valeur de départ.

Mis à jour le 16 juin 2004 Florian

Si la valeur d'une colonne de type AUTO_INCREMENT atteint la valeur maximum possible pour ce type de colonne, il peut se produire les choses suivantes :

  • Si la colonne est déclarée avec un index unique (UNIQUE INDEX ou PRIMARY KEY), une erreur va se produire et vous ne pourrez plus entrer de données dans cette table.
  • Si l'index n'est pas de type unique, la valeur maximum de la colonne sera réutilisée pour toutes les nouvelles insertions.

Mis à jour le 16 juin 2004 Florian

On ne peut avoir qu'une seule colonne de type AUTO_INCREMENT par table, et cette colonne doit être indexée. Ceci impose que cette colonne soit définie comme NOT NULL.

Mis à jour le 16 juin 2004 Florian

Pour réinitialiser une colonne AUTO_INCREMENT dans une table MyISAM, utilisez la commande

Code sql : Sélectionner tout
ALTER TABLE latable AUTO_INCREMENT=0
Vous pouvez également exécuter un DELETE FROM table. Ceci réinitialisera les compteurs, et il recommenceront à partir de 1.

Si vous devez réinitialiser les compteurs d'une table InnoDB, vous devrez soit supprimer et recréer la table (versions 3.23), utiliser TRUNCATE TABLE table (versions 4), ou supprimer toutes les lignes de la table, puis redémarrer le serveur.

Mis à jour le 16 juin 2004

Non, il est fortement déconseillé de procéder de cette façon.
Supposons que l'on ait deux utilisateurs à la fois, Alain et Béa. Le scénario suivant peut se produire :

  • Alain regarde l'état de la table et voit que le dernier ID est 5 ; il choisit donc d'insérer une nouvelle ligne avec l'ID 6.
  • Béa regarde l'état de la table et voit que le dernier ID est 5 ; elle choisit donc d'insérer une nouvelle ligne avec l'ID 6.
  • Alain insère sa ligne avec l'ID 6.
  • Béa tente d'insérer sa ligne avec l'ID 6, et provoque une violation de l'intégrité parce que l'ID en question existe déjà dans la table.

Pour gérer efficacement les identifiants, il est donc préférable d'en confier la gestion à des clés auto-incrémentées. S'il devient nécessaire de récupérer les identifiants générés, cela est possible de deux façons :

  • à l'aide de la fonction SQL LAST_INSERT_ID() ;
  • avec la fonction mysql_insert_id en PHP.

Pour plus d'informations à ce sujet, voir cet article.

Mis à jour le 28 décembre 2008 Alain Defrance

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

 
Contacter le responsable de la rubrique MySQL