Come resettare AUTO_INCREMENT in MySQL?


1246

Come posso resettare il AUTO_INCREMENTcampo di?
Voglio che inizi di 1nuovo a contare .


9
È possibile ottenere una risposta migliore sul sito per i DBA su dba.stackexchange.com
Rowland Shaw,

80
Probabilmente vorrai anche svuotare il tavolo:TRUNCATE TABLE yourTableName;
Konerak,


3
sì, la tabella troncata è la migliore in questo caso. ripristina anche l'avvio automatico dell'incremento a 1.
raidsan

2
A volte non si dispone dell'autorizzazione per TRUNCATE poiché ciò richiede autorizzazioni DROP.
Luke Cousins,

Risposte:


2025

È possibile ripristinare il contatore con:

ALTER TABLE tablename AUTO_INCREMENT = 1

Per InnoDB non è possibile impostare il auto_incrementvalore più basso o uguale all'indice corrente più alto. (citazione da ViralPatel ):

Si noti che non è possibile reimpostare il contatore su un valore inferiore o uguale a quelli già utilizzati. Per MyISAM, se il valore è inferiore o uguale al valore massimo attualmente nella colonna AUTO_INCREMENT, il valore viene ripristinato al massimo corrente più uno. Per InnoDB, se il valore è inferiore al valore massimo corrente nella colonna, non si verifica alcun errore e il valore della sequenza corrente non viene modificato.

Vedi Come resettare un AutoIncrement MySQL usando un valore MAX da un'altra tabella? su come ottenere in modo dinamico un valore accettabile.


8
Questo può richiedere un'eternità per un tavolo pieno. Fai attenzione a questo: stackoverflow.com/questions/2681869/…
BT

52
questo è uncircular reference
Besnik del

5
Cosa intendi con curcular reference?
Niels,

73
Tieni presente che MySql creerà una nuova tabella, con la stessa struttura e il nuovo valore auto_increment e copierà tutti i record dalla tabella originale, eliminando l'originale e rinominando quello nuovo. Ciò potrebbe avere un notevole impatto sulle prestazioni (e spazio su disco) sugli ambienti di produzione se la tabella è grande.
Rostol,

6
Questa risposta molto votata funziona davvero se hai già una colonna AUTOINCREMENT? Secondo i documenti di MySQL 5.1: "Non è possibile reimpostare il contatore su un valore inferiore o uguale a quello che è già stato utilizzato. Per MyISAM, se il valore è inferiore o uguale al valore massimo attualmente nella colonna AUTO_INCREMENT, il il valore viene ripristinato al massimo corrente più uno. Per InnoDB, se il valore è inferiore al valore massimo corrente nella colonna, non si verifica alcun errore e il valore della sequenza corrente non viene modificato. " Sembra che qui non accadrà nulla se l'autoincremento è maggiore di 1.
Lreeder

160
ALTER TABLE tablename AUTO_INCREMENT = 1

7
Posso sapere qual è la differenza tra la tua risposta e la risposta precedente
Praveen Srinivasan,

30
@PraveenSrinivasan nessuna differenza, li abbiamo aggiunti contemporaneamente
boobiq

79
Personalmente, penso che sia una cosa meravigliosa che queste due risposte per una domanda AUTO_INCREMENT abbiano avuto una collisione di concorrenza :-)
Mark Goldfain,

@MarkGoldfain sì, lo è!
ncomputers

la concorrenza causerà condizioni di gara mysql ...
Syamsoul Azrien,

81
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

Penso che questo lo farà


2
Questa domanda ha già una risposta appropriata. Inoltre, UPDATEaggiornerai tutti i valori nella idcolonna.
Kermit,

2
L'OP non afferma che stanno riordinando le righe esistenti.
Kermit,

Risposta completa e perfetta. Ma ho il dubbio che quando inseriremo un nuovo valore quale sarà il PK di quel valore. Che sia 1 o il prossimo PK?
Prifulnath,

sì, questa è la soluzione migliore, ma potresti voler bloccare le tabelle se ci sono dati scritti ad esempio tabelle di produzione
wavvves

molto utile, avevo lo stesso requisito in cui dovevo resettare l'incremento automatico per iniziare con 1, solo i primi due comandi mi hanno aiutato.
LOKENDRA,


40

inserisci qui la descrizione dell'immagineEsiste un modo molto semplice con phpmyadmin nella scheda "operazioni", è possibile impostare, nelle opzioni della tabella, l'incremento automatico del numero desiderato.


È necessario riavviare il servizio / server mysql subito dopo.
Cyber,

1
Non credo sia necessario riavviare il server dopo. PhpAdmin eseguirà semplicemente il comando per modificare il punto iniziale dell'incremento.
Kareem,

Non è necessario riavviare, ha effetto dal successivo inserimento.
IlludiumPu36

36

La migliore soluzione che ha funzionato per me:

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

È veloce, funziona con innoDB e non ho bisogno di conoscere l'attuale valore massimo! In questo modo il contatore di incremento automatico si ripristinerà e si avvierà automaticamente dal valore massimo esistente.


1
imposterà il valore NULL auto-inc su information_schema; checkSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun

1
Ho provato con la versione 5.6.x e questo ha funzionato perfettamente, e la query di Kerem Güneş ha restituito il valore massimo più uno, NON null come indicato. (forse è impostato su null dopo la prima query, ma non dopo la seconda query) Credo che questa sia la soluzione migliore per InnoDB.
Frank Forte

Come per il valore esplicito impostato: "crea una nuova tabella, con la stessa struttura e il nuovo valore auto_increment e copia tutti i record dalla tabella originale, elimina l'originale e rinomina quello nuovo. Ciò potrebbe avere un impatto notevole sulle prestazioni (e spazio su disco) negli ambienti di produzione se la tabella è grande ". ma molto peggio perché serve due volte la tabella di copia completa.
Enyby,

Verifico che questo funzioni per la versione 5.6.15, mentre ALTER TABLE tablename AUTO_INCREMENT = 1non lo è .
Nae,

24

Le risposte più votate a questa domanda raccomandano tutte "ALTER yourtable AUTO_INCREMENT = value". Tuttavia, questo funziona solo quando valuenella modifica è maggiore del valore massimo corrente della colonna di incremento automatico. Secondo la documentazione di MySQL 8 :

Non è possibile reimpostare il contatore su un valore inferiore o uguale al valore attualmente in uso. Per InnoDB e MyISAM, se il valore è inferiore o uguale al valore massimo attualmente nella colonna AUTO_INCREMENT, il valore viene reimpostato sul valore della colonna AUTO_INCREMENT corrente massimo più uno.

In sostanza, puoi solo modificare AUTO_INCREMENT per aumentare il valore della colonna di autoincremento, non reimpostarlo su 1, come l'OP pone nella seconda parte della domanda. Per le opzioni che consentono effettivamente di impostare AUTO_INCREMENT al di sotto del suo massimo corrente, dai un'occhiata a Riordina / ripristina chiave primaria di incremento automatico .


20

Aggiunta di un aggiornamento perché la funzionalità è cambiata in MySQL 5.6. A partire da MySQL 5.6 PUOI utilizzare la semplice ALTER TABLE con InnoDB:

ALTER TABLE tablename AUTO_INCREMENT = 1;

I documenti vengono aggiornati per riflettere questo:

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

Il mio test mostra anche che la tabella NON viene copiata, il valore viene semplicemente modificato.


19

Ci sono buone opzioni fornite in Come ripristinare la colonna di incremento automatico di MySQL

Si noti che ALTER TABLE tablename AUTO_INCREMENT = value;non non funziona per InnoDB


8
Come fare con InnoDB?
EmptyArsenal,

4
Funziona bene per me usando MySQL v 5.6.2
Eddie B,

Ho avuto un problema simile in cui un campo di incremento automatico non veniva ripristinato dopo aver eliminato i record da una tabella. TRUNCATE sembra aver funzionato. Penso che le soluzioni seguenti per rimuovere l'autoincremento e quindi riapplicare possano aiutare ad alleviare questo.
Craig Maloney,

@CraigMaloney - DELETE(o ROLLBACK) non recupererà gli ID. Un'eccezione: dopo un riavvio (o un arresto anomalo), viene calcolato l'id successivo MAX(id)+1, recuperando in modo efficace gli ID eliminati alla fine . Eccezione all'eccezione: MySQL 8.0 lascia inutilizzati quegli ID.
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)

L'ho usato in alcuni dei miei script, il campo ID viene eliminato e quindi aggiunto di nuovo con le impostazioni precedenti, tutti i campi esistenti nella tabella del database vengono compilati con nuovi valori di incremento automatico, questo dovrebbe funzionare anche con InnoDB.

Si noti che tutti i campi all'interno della tabella verranno conteggiati e avranno altri ID !!!.


3
Mi piacerebbe avere qualcosa del genere! Ma come ulteriore avvertimento; questo ovviamente spezzerebbe completamente le tue chiavi esterne.
NoobishPro,

12

Puoi anche usare la TRUNCATEtabella di sintassi in questo modo: TRUNCATE TABLE table_name

ATTENZIONE !! TRUNCATE TABLE your_tablesarà eliminare tutto nella vostra your_table!!


14
Nuovi programmatori , tieni presente che elimineràTRUNCATE anche TUTTE le tue righe nella tabella specificata!
Zanshin13

1
Il commento sopra dovrebbe essere inserito nella risposta, o almeno una spiegazione sull'uso effettivo di troncato.
Lucas Kauz,

TRUNCATEresetterà anche i auto_incrementcampi? Il mio caso d'uso è quello di cancellare i vecchi dati nella tabella e ricominciare gli ID da 1 per i nuovi dati (immagina, cancellare la tabella per un uso corretto dopo che il test è completo). Ho pensato che avrei dovuto ricoprire DROPl'intero tavolo CREATE.
ADTC,

Sì, TRUNCATE funziona come un reset sulla tabella. Questo non è del tutto vero se una tabella è stata modificata dalla sua creazione, quindi tali modifiche non verranno ripristinate. Suppongo che sia più vicino all'esportazione della struttura della tabella e all'uso dell'esportazione per creare una nuova tabella rispetto a un ripristino effettivo.
Chris,

Sì @ADTC. Se si desidera mantenere il auto_incrementvalore corrente , utilizzare DELETE FROMinvece di TRUNCATE.
TRiG

8

è per tabella vuota:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

se si dispone di dati ma si desidera riordinarli, si consiglia di utilizzare questo:

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`);

semplice da usare
Abdul Aziz Al Basyir,

Questo ha funzionato per noi con i dati. Reimposta la riga sull'indice successivo. Grazie!
Abbaglia il

urwell @Dazzle!
Abdul Aziz Al Basyir,

5

Ecco la mia soluzione, ma non consiglierò di farlo se la tua colonna ha vincoli o è collegata come chiave esterna ad altre tabelle in quanto avrebbe effetti negativi o non funzionerebbe.

> Primo: rilascia la colonna

ALTER TABLE tbl_name DROP COLUMN column_id

> Secondo: ricrea la colonna e impostala come PRIMA se la vuoi come prima colonna presumo.

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

Funziona bene!


3

A partire da MySQL 5.6 l'approccio seguente funziona più velocemente grazie al DDL online (nota algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;


2

Puoi semplicemente troncare la tabella per ripristinare la sequenza

TRUNCATE TABLE TABLE_NAME

1

Ho provato a modificare la tabella e impostare auto_increment su 1 ma non ha funzionato. Ho deciso di eliminare il nome della colonna che stavo incrementando, quindi creare una nuova colonna con il tuo nome preferito e impostare quella nuova colonna per incrementare dall'inizio.


potresti spiegarmi come l'hai fatto?
MZaragoza,

@MZaragoza Trascina semplicemente la vecchia colonna senza AI, quindi creane una nuova con AI abilitato.
Andromeda,

Puoi aggiornare la tua risposta per mostrarlo. Lo apprezzerei molto
MZaragoza,

1

Il contatore di incremento automatico per una tabella può essere (ri) impostato in due modi:

  1. Eseguendo una query, come altri hanno già spiegato:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. Utilizzo di Workbench o altri strumenti di progettazione di database visivi. Mostrerò su Workbench come è fatto, ma non dovrebbe essere molto diverso anche in altri strumenti. Facendo clic con il tasto destro sulla tabella desiderata e scegliendo Alter tabledal menu contestuale. Nella parte inferiore puoi vedere tutte le opzioni disponibili per modificare una tabella. Scegli Optionse otterrai questo modulo: inserisci qui la descrizione dell'immagine

    Quindi basta impostare il valore desiderato nel campo Auto incrementcome mostrato nell'immagine. Questo eseguirà sostanzialmente la query mostrata nella prima opzione.


0

Per aggiornare l'ultimo più un ID

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


0

Ho cercato su Google e trovato questa domanda, ma la risposta che sto davvero cercando soddisfa due criteri:

  1. usando query puramente MySQL
  2. resetta l'incremento automatico di una tabella esistente a max (id) + 1

Dal momento che non sono riuscito a trovare esattamente quello che voglio qui, ho raccolto la risposta da varie risposte e condividendola qui.

Poche cose da notare:

  1. la tabella in questione è InnoDB
  2. la tabella utilizza il campo idcon tipo asint chiave primaria
  3. l'unico modo per farlo esclusivamente in MySQL è utilizzare la stored procedure
  4. le mie immagini di seguito utilizzano SequelPro come GUI. Dovresti essere in grado di adattarlo in base al tuo editor MySQL preferito
  5. Ho provato questo su MySQL Ver 14.14 Distrib 5.5.61, per debian-linux-gnu

Passaggio 1: Creare la procedura memorizzata

creare una procedura memorizzata come questa:

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 ;

Quindi eseguirlo.

Prima dell'esecuzione, appare così quando si guarda sotto Stored Procedures nel database.

inserisci qui la descrizione dell'immagine

Quando corro, seleziono semplicemente la procedura memorizzata e premo Esegui selezione

inserisci qui la descrizione dell'immagine

Nota: la parte dei delimitatori è cruciale. Quindi, se copi e incolli dalle prime risposte selezionate in questa domanda, tendono a non funzionare per questo motivo.

Dopo l'esecuzione, dovrei vedere la procedura memorizzata

inserisci qui la descrizione dell'immagine

Se è necessario modificare la procedura memorizzata, è necessario eliminare la procedura memorizzata, quindi selezionare per eseguirla nuovamente.

Passaggio 2: chiamare la procedura memorizzata

Questa volta puoi semplicemente usare le normali query MySQL.

call reset_autoincrement('products');

Originariamente dalle mie note sulle query SQL in https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc e adattato per StackOverflow


0
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;

-1

Prova a eseguire questa query

 ALTER TABLE tablename AUTO_INCREMENT = value;

Oppure prova questa query per ripristinare l'incremento automatico

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

E imposta l'incremento automatico, quindi esegui questa query

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

-2

Ti suggerisco di accedere al Browser delle query e di eseguire le seguenti operazioni:

  1. Vai agli schemi e trova la tabella che vuoi modificare.
  2. Fare clic con il tasto destro del mouse e selezionare copia istruzione create.
  3. Apri una scheda dei risultati e incolla l'istruzione create loro.
  4. Vai all'ultima riga dell'istruzione create e cerca Auto_Increment = N, (dove N è un numero corrente per il campo auto_increment.)
  5. Sostituisci N con 1.
  6. Premi ctrl+enter .

L'incremento automatico dovrebbe reimpostarsi su uno dopo aver inserito una nuova riga nella tabella.

Non so cosa accadrà se provi ad aggiungere una riga in cui esiste già un valore del campo auto_increment.

Spero che questo aiuto!


-2

Il modo migliore è rimuovere il campo con AI e aggiungerlo di nuovo con AI, funziona per tutte le tabelle


1
non è affatto il modo migliore, rilasciare una colonna perderà i dati della colonna
Disha Goyal
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.