Comment réinitialiser AUTO_INCREMENT dans MySQL?

1246

Comment puis-je réinitialiser le AUTO_INCREMENTchamp?
Je veux qu'il recommence à compter 1.

Home Run
la source
9
Vous pouvez obtenir une meilleure réponse sur le site pour les administrateurs de base de données à dba.stackexchange.com
Rowland Shaw
80
Vous voudrez probablement vider la table aussi:TRUNCATE TABLE yourTableName;
Konerak
3
oui, la table tronquée est la meilleure dans ce cas. il réinitialise également l'incrémentation automatique à 1.
raidsan
2
Parfois, vous n'avez pas l'autorisation de TRUNCATE car cela nécessite des autorisations DROP.
Luke Cousins

Réponses:

2025

Vous pouvez réinitialiser le compteur avec:

ALTER TABLE tablename AUTO_INCREMENT = 1

Pour InnoDB, vous ne pouvez pas définir une auto_incrementvaleur inférieure ou égale à l'indice de courant le plus élevé. (citation de ViralPatel ):

Notez que vous ne pouvez pas réinitialiser le compteur à une valeur inférieure ou égale à celles qui ont déjà été utilisées. Pour MyISAM, si la valeur est inférieure ou égale à la valeur maximale actuellement dans la colonne AUTO_INCREMENT, la valeur est réinitialisée au maximum actuel plus un. Pour InnoDB, si la valeur est inférieure à la valeur maximale actuelle dans la colonne, aucune erreur ne se produit et la valeur de séquence actuelle n'est pas modifiée.

Voir Comment réinitialiser une incrémentation automatique MySQL en utilisant une valeur MAX d'une autre table? sur la façon d'obtenir dynamiquement une valeur acceptable.

Niels
la source
8
Cela peut prendre une éternité pour une table remplie. Soyez prudent avec ceci: stackoverflow.com/questions/2681869/…
BT
52
c'est uncircular reference
Besnik
5
Qu'entendez-vous par curcular reference?
Niels
73
Gardez à l'esprit que MySql créera une nouvelle table, avec la même structure et la nouvelle valeur auto_increment et copiera tous les enregistrements de la table d'origine, supprimez l'original et renommez la nouvelle. Cela peut avoir un impact considérable sur les performances (et l'espace disque) sur les environnements de production si la table est grande.
Rostol
6
Cette réponse très votée fonctionne-t-elle vraiment si vous avez déjà une colonne AUTOINCREMENT? Selon les documents MySQL 5.1: "Vous ne pouvez pas réinitialiser le compteur à une valeur inférieure ou égale à celles qui ont déjà été utilisées. Pour MyISAM, si la valeur est inférieure ou égale à la valeur maximale actuellement dans la colonne AUTO_INCREMENT, le La valeur est réinitialisée au maximum actuel plus un. Pour InnoDB, si la valeur est inférieure à la valeur maximale actuelle dans la colonne, aucune erreur ne se produit et la valeur de séquence actuelle n'est pas modifiée. " On dirait que rien ne se passera ici si l'auto-incrémentation est supérieure à 1.
lreeder
160
ALTER TABLE tablename AUTO_INCREMENT = 1
boobiq
la source
7
Puis-je savoir quelle est la différence entre votre réponse et la réponse précédente
Praveen Srinivasan
30
@PraveenSrinivasan aucune différence, nous les avons ajoutés en même temps
boobiq
79
Personnellement, je pense que c'est une belle chose que ces deux réponses à une question AUTO_INCREMENT aient eu une collision simultanée :-)
Mark Goldfain
@MarkGoldfain oui c'est ça!
ncomputers
la concurrence entraînera une condition de course mysql ...
Syamsoul Azrien
81
SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;

Je pense que ça va le faire

nghiepit
la source
2
Cette question a déjà une réponse appropriée. De plus, votre UPDATEmettra à jour toutes les valeurs dans la idcolonne.
Kermit
2
L'OP n'indique pas qu'ils réorganisent les lignes existantes.
Kermit
Réponse complète et parfaite. Mais j'ai un doute que lorsque nous insérons une nouvelle valeur, quel sera le PK de cette valeur. Que ce soit 1 ou le prochain PK?
Prifulnath
oui, c'est la meilleure solution, mais vous voudrez peut-être verrouiller les tables s'il y a des données en cours d'écriture, par exemple les tables de production
wavvves
très utile, j'avais la même exigence où je devais réinitialiser l'incrémentation automatique pour commencer avec 1, seules les deux premières commandes ont aidé.
LOKENDRA
59

Tout simplement comme ceci:

ALTER TABLE tablename AUTO_INCREMENT = value;

référence: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

fyr
la source
5
resetsignifie le mettre à la valeur par défaut ... afin que vous puissiez remplacer "valeur" par 1
Besnik
40

entrez la description de l'image iciIl existe un moyen très simple avec phpmyadmin sous l'onglet "opérations", vous pouvez définir, dans les options du tableau, l'auto-incrémentation du nombre que vous souhaitez.

Miles M.
la source
Vous devez redémarrer le service / serveur mysql juste après cela.
Cyber
1
Je ne pense pas que vous ayez besoin de redémarrer votre serveur après cela. PhpAdmin exécutera simplement la commande pour changer le point de départ de l'incrément.
Kareem
Vous n'avez pas besoin de redémarrer, cela prend effet à partir de la prochaine insertion.
IlludiumPu36
36

La meilleure solution qui a fonctionné pour moi:

ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED;
COMMIT;
ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED AUTO_INCREMENT;
COMMIT;

Son rapide, fonctionne avec innoDB, et je n'ai pas besoin de connaître la valeur maximale actuelle! De cette façon, le compteur d'incrémentation automatique sera réinitialisé et il démarrera automatiquement à partir de la valeur maximale existante.

trust_words
la source
1
il définira la valeur NULL auto-inc sur information_schema; checkSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun
1
J'ai testé sur la version 5.6.x et cela a parfaitement fonctionné, et la requête de Kerem Güneş a renvoyé la valeur maximale plus un, PAS nulle comme indiqué. (il est peut-être défini sur null après la première requête, mais pas après la deuxième requête). Je pense que c'est la meilleure solution pour InnoDB.
Frank Forte
Identique à la valeur explicite définie: "créer une nouvelle table, avec la même structure et la nouvelle valeur auto_increment et copier tous les enregistrements de la table d'origine, supprimer l'original et renommer la nouvelle. Cela pourrait avoir un impact considérable sur les performances (et l'espace disque) sur les environnements de production si la table est grande. " mais bien pire car il faut deux fois la table de copie complète.
Enyby
Je vérifie que cela fonctionne pour la version 5.6.15, alors ALTER TABLE tablename AUTO_INCREMENT = 1que non .
Nae
24

Les réponses les mieux notées à cette question recommandent toutes "ALTER yourtable AUTO_INCREMENT = value". Cependant, cela ne fonctionne que lorsque valuel'alter est supérieur à la valeur maximale actuelle de la colonne d'auto-incrémentation. Selon la documentation MySQL 8 :

Vous ne pouvez pas réinitialiser le compteur à une valeur inférieure ou égale à la valeur actuellement utilisée. Pour InnoDB et MyISAM, si la valeur est inférieure ou égale à la valeur maximale actuellement dans la colonne AUTO_INCREMENT, la valeur est réinitialisée à la valeur maximale actuelle de la colonne AUTO_INCREMENT plus un.

En substance, vous ne pouvez modifier AUTO_INCREMENT que pour augmenter la valeur de la colonne d'auto-incrémentation, pas la remettre à 1, comme l'OP le demande dans la deuxième partie de la question. Pour les options qui vous permettent de définir l'AUTO_INCREMENT vers le bas à partir de son maximum actuel, jetez un œil à Réorganiser / réinitialiser la clé primaire d'incrémentation automatique .

lreeder
la source
20

Ajout d'une mise à jour car la fonctionnalité a changé dans MySQL 5.6. Depuis MySQL 5.6, vous POUVEZ utiliser le simple ALTER TABLE avec InnoDB:

ALTER TABLE tablename AUTO_INCREMENT = 1;

Les documents sont mis à jour pour refléter ceci:

http://dev.mysql.com/doc/refman/5.6/en/alter-table.html

Mes tests montrent également que la table n'est PAS copiée, la valeur est simplement modifiée.

SeanN
la source
19

De bonnes options sont données dans Comment réinitialiser la colonne d'auto-incrémentation MySQL

Notez que ALTER TABLE tablename AUTO_INCREMENT = value;cela ne fonctionne pas pour InnoDB

Naz
la source
8
Savez-vous comment faire cela avec InnoDB?
EmptyArsenal
4
Fonctionne très bien pour moi en utilisant MySQL v 5.6.2
Eddie B
J'ai eu un problème similaire où un champ d'incrémentation automatique n'était pas réinitialisé après avoir supprimé des enregistrements d'une table. TRUNCATE semble avoir fonctionné. Je pense que les solutions ci-dessous pour supprimer l'auto-incrémentation puis la réapplication peuvent aider à atténuer cela.
Craig Maloney
@CraigMaloney - DELETE(ou ROLLBACK) ne récupérera pas les identifiants. Une exception: après un redémarrage (ou un crash), l'ID suivant est calculé comme MAX(id)+1tel, récupérant ainsi efficacement les ID supprimés à la fin . Exception à l'exception: MySQL 8.0 laisse ces identifiants inutilisés.
Rick James
12
ALTER TABLE news_feed DROP id

ALTER TABLE news_feed ADD  id BIGINT( 200 ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id)

J'ai utilisé cela dans certains de mes scripts, le champ id est supprimé puis ajouté avec les paramètres précédents, tous les champs existants dans la table de base de données sont remplis avec de nouvelles valeurs d'incrémentation automatique, cela devrait également fonctionner avec InnoDB.

Notez que tous les champs de la table seront recomptés et auront d'autres identifiants !!!.

Alin Razvan
la source
3
J'aimerais avoir quelque chose comme ça! Mais comme un avertissement supplémentaire; cela casserait évidemment complètement vos clés étrangères.
NoobishPro
12

Vous pouvez également utiliser le TRUNCATEtableau de syntaxe comme ceci: TRUNCATE TABLE table_name

IL FAUT SE MÉFIER!! TRUNCATE TABLE your_tableva supprimer tout dans votre your_table!!

Manohar Kumar
la source
14
Nouveaux programmeurs , sachez que TRUNCATEcela supprimera également TOUTES vos lignes dans le tableau spécifié!
Zanshin13
1
Le commentaire ci-dessus doit être inséré dans la réponse, ou au moins une explication sur l'utilisation réelle de tronquer.
Lucas Kauz
TRUNCATEva également réinitialiser les auto_incrementchamps? Mon cas d'utilisation est d'effacer les anciennes données du tableau et de recommencer les ID à partir de 1 pour les nouvelles données (imaginez, effacer le tableau pour une utilisation correcte une fois le test terminé). Je pensais que je devrais à DROPla table entière et CREATEencore.
ADTC
Oui, TRUNCATE fonctionne comme une réinitialisation sur la table. Ce n'est pas entièrement vrai si une table a été MODIFIÉE depuis sa création, ces modifications ne seront pas réinitialisées. Je suppose que c'est plus proche de l'exportation de la structure de la table et de l'utilisation de l'exportation pour créer une nouvelle table qu'une réinitialisation réelle.
Chris
Oui @ADTC. Si vous souhaitez conserver la auto_incrementvaleur actuelle , utilisez DELETE FROMplutôt que TRUNCATE.
TRiG
8

c'est pour une table vide:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

si vous avez des données mais que vous voulez les ranger, je recommande d'utiliser ceci:

ALTER TABLE `table_name` DROP `auto_colmn`;
ALTER TABLE `table_name` ADD  `auto_colmn` INT( {many you want} ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`auto_colmn`);
Abdul Aziz Al Basyir
la source
simple à utiliser
Abdul Aziz Al Basyir
Cela a fonctionné pour nous avec les données. Il réinitialise la ligne à l'index suivant. Merci!
Dazzle
urwell @Dazzle!
Abdul Aziz Al Basyir
5

Voici ma solution, mais je ne conseillerai pas de le faire si votre colonne a des contraintes ou est connectée en tant que clé étrangère à d'autres tables car cela aurait de mauvais effets ou ne fonctionnerait même pas.

> Premièrement: déposez la colonne

ALTER TABLE tbl_name DROP COLUMN column_id

> Deuxièmement: recréez la colonne et définissez-la comme PREMIÈRE si vous la souhaitez comme première colonne, je suppose.

ALTER TABLE tbl_access ADD COLUMN `access_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST

Ça marche bien!

bdalina
la source
3

Depuis MySQL 5.6, l'approche ci-dessous fonctionne plus rapidement en raison de la DDL en ligne (remarque algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;

artsafin
la source
2

Vous pouvez simplement tronquer le tableau pour réinitialiser la séquence

TRUNCATE TABLE TABLE_NAME
Kunwar Babu
la source
1

J'ai essayé de modifier la table et de mettre auto_increment à 1 mais cela n'a pas fonctionné. J'ai résolu de supprimer le nom de la colonne que j'incrémentais, puis de créer une nouvelle colonne avec votre nom préféré et de définir cette nouvelle colonne pour qu'elle s'incrémente dès le début.

andromède
la source
pourriez-vous expliquer comment vous avez rendu cela possible?
MZaragoza
@MZaragoza Déposez simplement l'ancienne colonne qui n'a pas d'IA, puis créez-en une nouvelle avec l'IA activée.
andromeda
Pouvez-vous mettre à jour votre réponse pour le montrer. Je l'apprécierais vraiment
MZaragoza
1

Le compteur d'incrémentation automatique d'une table peut être (re) défini de deux manières:

  1. En exécutant une requête, comme d'autres l'ont déjà expliqué:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. Utilisation de Workbench ou d'un autre outil de conception de base de données visuelle. Je vais montrer dans Workbench comment cela se fait - mais cela ne devrait pas être très différent dans les autres outils également. En faisant un clic droit sur la table souhaitée et en choisissant Alter tabledans le menu contextuel. En bas, vous pouvez voir toutes les options disponibles pour modifier une table. Choisissez Optionset vous obtiendrez ce formulaire: entrez la description de l'image ici

    Ensuite, définissez simplement la valeur souhaitée dans le champ, Auto incrementcomme indiqué dans l'image. Cela exécutera essentiellement la requête indiquée dans la première option.

Kristijan Iliev
la source
0

Pour mettre à jour le dernier identifiant plus un

 ALTER TABLE table_name AUTO_INCREMENT = 
 (SELECT (id+1) id FROM table_name order by id desc limit 1);
narasimharaosp
la source
0

ALTER TABLE nom_table AUTO_INCREMENT = 1

santosh mahule
la source
0

J'ai googlé et trouvé cette question, mais la réponse que je cherche vraiment remplit deux critères:

  1. en utilisant des requêtes purement MySQL
  2. réinitialiser l'incrémentation automatique d'une table existante à max (id) + 1

Comme je n'ai pas pu trouver exactement ce que je veux ici, j'ai bricolé la réponse à partir de diverses réponses et je l'ai partagée ici.

Peu de choses à noter:

  1. la table en question est InnoDB
  2. la table utilise le champ idavec le type comme intclé primaire
  3. la seule façon de le faire purement dans MySQL est d'utiliser la procédure stockée
  4. mes images ci-dessous utilisent SequelPro comme interface graphique. Vous devriez pouvoir l'adapter en fonction de votre éditeur MySQL préféré
  5. J'ai testé cela sur MySQL Ver 14.14 Distrib 5.5.61, pour debian-linux-gnu

Étape 1: créer une procédure stockée

créer une procédure stockée comme celle-ci:

DELIMITER //
CREATE PROCEDURE reset_autoincrement(IN tablename varchar(200))
BEGIN

      SET @get_next_inc = CONCAT('SELECT @next_inc := max(id) + 1 FROM ',tablename,';');
      PREPARE stmt FROM @get_next_inc; 
      EXECUTE stmt; 
      SELECT @next_inc AS result;
      DEALLOCATE PREPARE stmt; 

      set @alter_statement = concat('ALTER TABLE ', tablename, ' AUTO_INCREMENT = ', @next_inc, ';');
      PREPARE stmt FROM @alter_statement;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

Ensuite, lancez-le.

Avant l'exécution, cela ressemble à ceci lorsque vous regardez sous Procédures stockées dans votre base de données.

entrez la description de l'image ici

Lorsque j'exécute, je sélectionne simplement la procédure stockée et j'appuie sur Exécuter la sélection

entrez la description de l'image ici

Remarque: la partie délimiteurs est cruciale. Par conséquent, si vous copiez et collez à partir des meilleures réponses sélectionnées dans cette question, elles ont tendance à ne pas fonctionner pour cette raison.

Après avoir exécuté, je devrais voir la procédure stockée

entrez la description de l'image ici

Si vous devez modifier la procédure stockée, vous devez supprimer la procédure stockée, puis sélectionnez pour réexécuter.

Étape 2: appelez la procédure stockée

Cette fois, vous pouvez simplement utiliser des requêtes MySQL normales.

call reset_autoincrement('products');

À l'origine de mes propres notes de requêtes SQL dans https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc et adapté pour StackOverflow

Kim Stacks
la source
0
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
Mihai Galan
la source
-1

Essayez d'exécuter cette requête

 ALTER TABLE tablename AUTO_INCREMENT = value;

Ou essayez cette requête pour réinitialiser l'incrémentation automatique

 ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL;

Et définir l'incrémentation automatique, puis exécuter cette requête

  ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
Shabeer Sha
la source
-2

Je vous suggère d'aller dans le navigateur de requêtes et de faire ce qui suit:

  1. Accédez aux schémas et recherchez la table que vous souhaitez modifier.
  2. Cliquez avec le bouton droit et sélectionnez copier créer l'instruction.
  3. Ouvrez un onglet de résultat et collez l'instruction create leur.
  4. Accédez à la dernière ligne de l'instruction create et recherchez Auto_Increment = N, (où N est un nombre actuel pour le champ auto_increment.)
  5. Remplacez N par 1.
  6. Appuyez sur ctrl+enter .

Auto_increment doit être réinitialisé à un une fois que vous entrez une nouvelle ligne dans le tableau.

Je ne sais pas ce qui se passera si vous essayez d'ajouter une ligne où une valeur de champ auto_increment existe déjà.

J'espère que cette aide!

jeson
la source
-2

Le meilleur moyen est de supprimer le champ avec l'IA et de l'ajouter à nouveau avec l'IA, fonctionne pour toutes les tables

Grincheux
la source
1
pas le meilleur moyen du tout, supprimer une colonne perdra les données de la colonne
Disha Goyal