MySQL AUTO_INCREMENT avec exemples

โšก Rรฉsumรฉ intelligent

MySQL L'attribut AUTO_INCREMENT gรฉnรจre automatiquement des numรฉros sรฉquentiels pour une colonne numรฉrique ร  chaque insertion d'une ligne. Cet attribut รฉvite le calcul manuel des identifiants uniques et constitue ainsi la mรฉthode standard pour initialiser une clรฉ primaire.

  • (I.e. Comportement fondamental : AUTO_INCREMENT attribue le numรฉro suivant dans la sรฉquence ร  chaque insertion d'une nouvelle ligne, en commenรงant par 1 et par incrรฉments.ping dรจs 1.
  • (I.e. Rรดle clรฉ principal : Cet attribut garantit un identifiant unique sans requรชte de recherche, il constitue donc le choix standard pour une clรฉ primaire de substitution.
  • ๐Ÿงฑ Exigences relatives aux colonnes : La colonne doit รชtre de type entier et doit รชtre indexรฉe, ce que la dรฉclaration PRIMARY KEY satisfait dรฉjร .
  • โž• Insรฉrer un motif : Omettez la colonne d'identifiant de l'instruction INSERT et MySQL fournit la valeur, puis LAST_INSERT_ID() la renvoie.
  • ๐Ÿ‡ง๐Ÿ‡ท Valeur de dรฉpart personnalisรฉe : Les instructions CREATE TABLE ou ALTER TABLE acceptent AUTO_INCREMENT = 10 pour commencer la sรฉquence ร  un nombre choisi.
  • ๐Ÿ•ณ๏ธ Prรฉvoir des lacunes : Les lignes supprimรฉes et les transactions annulรฉes consomment des numรฉros de maniรจre permanente, de sorte que la sรฉquence reste unique mais non contiguรซ.

MySQL INCRร‰MENTATION AUTOMATIQUE

Quโ€™est-ce que lโ€™incrรฉmentation automatique ?

Auto Increment est une fonction qui fonctionne sur les types de donnรฉes numรฉriques. Il gรฉnรจre automatiquement des valeurs numรฉriques sรฉquentielles chaque fois qu'un enregistrement est insรฉrรฉ dans une table pour un champ dรฉfini comme incrรฉmentation automatique.

Cet attribut fonctionne avec tous les types entiers, de TINYINT ร  BIGINT. La colonne doit รฉgalement รชtre indexรฉe, ce qui est automatique lorsqu'elle est dรฉclarรฉe comme clรฉ primaire.

Quand utiliser lโ€™incrรฉmentation automatique ?

Dans la leรงon sur normalisation des bases de donnรฉesNous avons examinรฉ comment les donnรฉes peuvent รชtre stockรฉes avec une redondance minimale, en les stockant dans de nombreuses petites tables, liรฉes entre elles par des clรฉs primaires et รฉtrangรจres.

MySQL AUTO_INCREMENT avec exemples

Une clรฉ primaire doit รชtre unique, car elle identifie de maniรจre unique une ligne dans une base de donnรฉes. Mais comment garantir que la clรฉ primaire est toujours unique ?

Une solution possible serait d'utiliser une formule pour gรฉnรฉrer la clรฉ primaire, qui vรฉrifie son existence dans la table avant d'y ajouter des donnรฉes. Cette solution peut fonctionner, mais elle est complexe et non infaillible. Deux sessions insรฉrant des donnรฉes simultanรฉment peuvent toujours lire la mรชme valeur maximale et provoquer un conflit.

Afin d'รฉviter une telle complexitรฉ et de garantir que la clรฉ primaire soit toujours unique, nous pouvons utiliser la MySQL La fonctionnalitรฉ d'auto-incrรฉmentation permet de gรฉnรฉrer des clรฉs primaires. Elle est utilisรฉe avec le type de donnรฉes INT, qui prend en charge les valeurs signรฉes et non signรฉes. Les donnรฉes non signรฉes ne peuvent contenir que des nombres positifs. Il est recommandรฉ de dรฉfinir une contrainte de non-signature sur la clรฉ primaire ร  auto-incrรฉmentation.

Syntaxe d'incrรฉmentation automatique

Une fois le raisonnement รฉtabli, examinez le script utilisรฉ pour crรฉer le tableau des catรฉgories de films.

CREATE TABLE `categories` (
  `category_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `category_name` varchar(150) DEFAULT NULL,
  `remarks` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`category_id`)
);

Notez la mention ยซ AUTO_INCREMENT ยป dans le champ category_id. Cela permet de gรฉnรฉrer automatiquement l'identifiant de la catรฉgorie ร  chaque insertion d'une nouvelle ligne dans la table. Cet identifiant n'est pas fourni lors de l'insertion des donnรฉes. MySQL le gรฉnรจre.

ร€ noter: Le mot-clรฉ UNSIGNED double la plage positive de la colonne, et la largeur d'affichage, autrefois รฉcrite sous la forme int(11), est obsolรจte. MySQL ร€ partir du 8.0.17. Simple int est la forme actuelle.

Par dรฉfaut, la valeur initiale de AUTO_INCREMENT est 1, et elle sera incrรฉmentรฉe de 1 pour chaque nouvel enregistrement.

Examinons le contenu actuel du tableau des catรฉgories.

SELECT * FROM `categories`;

Exรฉcuter le script ci-dessus dans MySQL Workbench appliquรฉ ร  myflixdb nous donne les rรฉsultats suivants.

category_id category_name remarks
1 Comedy Movies with humour
2 Romantic Love stories
3 Epic Story acient movies
4 Horror NULL
5 Science Fiction NULL
6 Thriller NULL
7 Action NULL
8 Romantic Comedy NULL

Il existe huit lignes, donc le prochain identifiant gรฉnรฉrรฉ devrait รชtre 9. Insรฉrons maintenant une nouvelle catรฉgorie dans la table des catรฉgories, en ne fournissant que le nom.

INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');

Exรฉcution du script ci-dessus sur myflixdb dans MySQL รฉtabli nous donne les rรฉsultats suivants prรฉsentรฉs ci-dessous.

category_id category_name remarks
1 Comedy Movies with humour
2 Romantic Love stories
3 Epic Story acient movies
4 Horror NULL
5 Science Fiction NULL
6 Thriller NULL
7 Action NULL
8 Romantic Comedy NULL
9 Cartoons NULL

Veuillez noter que nous n'avons pas fourni l'identifiant de catรฉgorie. MySQL Il a รฉtรฉ gรฉnรฉrรฉ automatiquement, car l'identifiant de catรฉgorie est dรฉfini comme auto-incrรฉmentรฉ.

Si vous souhaitez obtenir le dernier identifiant d'insertion gรฉnรฉrรฉ par MySQL, vous pouvez utiliser la fonction LAST_INSERT_ID pour ce faire. Le script ci-dessous obtient le dernier identifiant gรฉnรฉrรฉ.

SELECT LAST_INSERT_ID();

L'exรฉcution du script ci-dessus renvoie le dernier numรฉro d'auto-incrรฉmentation gรฉnรฉrรฉ par la requรชte INSERT. Les rรฉsultats sont affichรฉs ci-dessous.

MySQL INCRร‰MENTATION AUTOMATIQUE

Astuce: La fonction LAST_INSERT_ID() est limitรฉe ร  votre propre connexion ; par consรฉquent, une valeur gรฉnรฉrรฉe par lโ€™insertion dโ€™un autre utilisateur ne peut jamais vous รชtre renvoyรฉe par erreur.

Comment dรฉfinir ou rรฉinitialiser la valeur de dรฉpart de AUTO_INCREMENT

La numรฉrotation par dรฉfaut commence ร  1, mais elle ne correspond pas toujours aux besoins d'un projet. Il peut รชtre nรฉcessaire de reprendre la numรฉrotation des factures d'un systรจme existant, et il est souvent indispensable de rรฉinitialiser une table de test. MySQL Le compteur est directement accessible, ce qui permet de traiter les deux cas avec une seule clause. Suivez ces รฉtapes pour contrรดler le nombre initial.

  1. Dรฉfinissez la valeur lors de la crรฉation. Ajoutez la clause AUTO_INCREMENT ร  l'instruction CREATE TABLE. La premiรจre ligne insรฉrรฉe recevra alors ce numรฉro au lieu de 1.
  2. Modifier la valeur d'un tableau existant. Utilisez le ALTER TABLE avec la mรชme clause. MySQL n'accepte le nouveau numรฉro que s'il est supรฉrieur ร  l'identifiant le plus long actuellement stockรฉ.
  3. Rรฉinitialisez une table que vous avez vidรฉe. La commande TRUNCATE TABLE supprime toutes les lignes et remet le compteur ร  1 en une seule opรฉration, ce que la commande DELETE seule ne fait pas.
  4. Confirmez la modification. Insรฉrez une ligne et relisez l'identifiant avec LAST_INSERT_ID() avant de vous fier ร  la nouvelle sรฉquence.
-- Start a brand-new table at 1000
CREATE TABLE `invoices` (
  `invoice_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `amount` decimal(10,2),
  PRIMARY KEY (`invoice_id`)
) AUTO_INCREMENT = 1000;

-- Move the counter on an existing table
ALTER TABLE `categories` AUTO_INCREMENT = 100;

-- Empty the table and reset the counter to 1
TRUNCATE TABLE `categories`;

La taille du pas peut รฉgalement รชtre modifiรฉe via la variable systรจme auto_increment_increment, mais cette modification s'applique ร  l'ensemble du serveur et non ร  une seule table. Elle est principalement utilisรฉe en rรฉplication, lorsque deux serveurs ne doivent pas gรฉnรฉrer le mรชme identifiant.

Pourquoi des lacunes apparaissent-elles dans une sรฉquence AUTO_INCREMENT ?

Tรดt ou tard, un tableau affiche des identifiants tels que 1, 2, 5, 6. Rien n'est cassรฉ. Le compteur est conรงu pour garantir l'unicitรฉ, et non la continuitรฉ d'une suite de nombres ; il ne renvoie jamais deux fois la mรชme valeur.

Des lacunes apparaissent pour les raisons suivantes.

  • Lignes supprimรฉes : Lorsqu'une ligne est supprimรฉe d'une table, son identifiant auto-incrรฉmentรฉ n'est pas rรฉutilisรฉ. MySQL continue de gรฉnรฉrer de nouveaux numรฉros de maniรจre sรฉquentielle.
  • Transactions annulรฉes : Le numรฉro est rรฉservรฉ dรจs l'exรฉcution de l'insertion. Si la transaction est annulรฉe, la ligne disparaรฎt, mais le numรฉro a dรฉjร  รฉtรฉ dรฉpensรฉ.
  • Insertions รฉchouรฉes : Une instruction rejetรฉe par une contrainte UNIQUE peut tout de mรชme consommer un identifiant avant d'รฉchouer.
  • Inserts en vrac : InnoDB peut rรฉserver un bloc de nombres pour une insertion multi-lignes et supprimer ceux qu'il n'utilise pas.

Tenter de combler ces lacunes est une erreur. Renumรฉroter les lignes invalide toutes les clรฉs รฉtrangรจres qui y font rรฉfรฉrence, et la valeur elle-mรชme n'a aucune signification mรฉtier. Si un rapport nรฉcessite une liste continue, gรฉnรฉrez le numรฉro de ligne dans la requรชte au lieu de rรฉรฉcrire les donnรฉes stockรฉes.

FAQ

Non. MySQL Autorise une seule colonne AUTO_INCREMENT par table, et cette colonne doit รชtre indexรฉe. La dรฉclarer comme telle clรฉ primaire satisfait aux exigences d'indexation.

Les insertions รฉchouent avec une erreur de clรฉ dupliquรฉe, car le compteur ne peut pas dรฉpasser la limite du type de donnรฉes. Un TINYINT non signรฉ s'arrรชte ร  255. Modifiez le type de la colonne en utilisant un type plus large comme BIGINT avant d'atteindre cette limite.

Oui, de MySQL ร€ partir de la version 8.0, InnoDB enregistre le compteur dans le journal de restauration, ce qui permet sa rรฉcupรฉration aprรจs un redรฉmarrage. Les versions prรฉcรฉdentes le recalculaient et pouvaient rรฉattribuer les numรฉros libรฉrรฉs par des suppressions.

En partie. Assistants de schรฉmas d'IA intรฉgrรฉs ร  des outils tels que MySQL Workbench Suggรฉrez un entier non signรฉ suffisamment grand pour le volume que vous dรฉcrivez. La prรฉcision de l'estimation dรฉpend de la valeur de croissance que vous fournissez ; vรฉrifiez-la donc.

Souvent, oui. Les assistants de requรชtes IA signalent les transactions annulรฉes et les รฉchecs. INSERT Les dรฉclarations et les lignes supprimรฉes sont les causes habituelles. Considรฉrez cette explication comme un point de dรฉpart et vรฉrifiez-la ร  l'aide des journaux du serveur.

Rรฉsumez cet article avec :