FAQ MySQLConsultez toutes les FAQ
Nombre d'auteurs : 15, 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.
- Comment fonctionne le système des clefs auto-incrémentées ?
- Que mettre comme valeur lors d'un INSERT ou d'un UPDATE sur un champ autoincrémenté ?
- Comment récupérer la dernière valeur d'un champ autoincrémenté ?
- Pourquoi les valeurs sont parfois réutilisées ?
- Est-il possible de préciser une valeur de départ ?
- Que se passe-t-il en cas de dépassement ?
- MySQL n'accepte pas ma définition de structure avec colonne auto-incrémenté.
- Comment remettre à zéro un auto-incrément ?
- Peut-on utiliser MAX(ID) + 1 pour alimenter une clé en auto_increment ?
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().
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 (...) |
Code sql : | Sélectionner tout |
1 2 | INSERT INTO MaTable VALUES (DEFAULT, ...) |
L'insertion de valeurs négatives est fortement déconseillée.
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.
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.
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.
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.
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.
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
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.
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.
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 çaLes 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 © 2024 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.