Wie setze ich AUTO_INCREMENT in MySQL zurück?

1246

Wie kann ich das eines Feldes zurücksetzenAUTO_INCREMENT ?
Ich möchte, dass es wieder anfängt zu zählen 1.

Home Run
quelle
9
Sie können eine bessere Antwort auf der Website für DBAs unter dba.stackexchange.com
Rowland Shaw
80
Sie werden wahrscheinlich auch den Tisch leeren wollen:TRUNCATE TABLE yourTableName;
Konerak
3
Ja, in diesem Fall ist das Abschneiden der Tabelle am besten. es setzt auch den automatischen Inkrementstart auf 1 zurück.
raidsan
2
Manchmal haben Sie keine Berechtigung zum TRUNCATE, da hierfür DROP-Berechtigungen erforderlich sind.
Luke Cousins

Antworten:

2024

Sie können den Zähler zurücksetzen mit:

ALTER TABLE tablename AUTO_INCREMENT = 1

Für InnoDB können Sie den auto_incrementWert nicht niedriger oder gleich dem höchsten aktuellen Index setzen. (Zitat aus ViralPatel ):

Beachten Sie, dass Sie den Zähler nicht auf einen Wert zurücksetzen können, der kleiner oder gleich dem bereits verwendeten Wert ist. Wenn der Wert für MyISAM kleiner oder gleich dem aktuellen Maximalwert in der Spalte AUTO_INCREMENT ist, wird der Wert auf das aktuelle Maximum plus eins zurückgesetzt. Wenn für InnoDB der Wert kleiner als der aktuelle Maximalwert in der Spalte ist, tritt kein Fehler auf und der aktuelle Sequenzwert wird nicht geändert.

Siehe Zurücksetzen eines MySQL AutoIncrement mithilfe eines MAX-Werts aus einer anderen Tabelle. wie man dynamisch einen akzeptablen Wert erhält.

Niels
quelle
8
Dies kann für einen gefüllten Tisch ewig dauern. Seien Sie vorsichtig damit: stackoverflow.com/questions/2681869/…
BT
52
Dies ist eincircular reference
Besnik
5
Was meinst du damit curcular reference?
Niels
73
Beachten Sie, dass MySql eine neue Tabelle mit derselben Struktur und demselben neuen Wert für auto_increment erstellt und alle Datensätze aus der Originaltabelle kopiert, das Original löscht und die neue umbenennt. Dies kann erhebliche Auswirkungen auf die Leistung (und den Speicherplatz) in Produktionsumgebungen haben, wenn die Tabelle groß ist.
Rostol
6
Funktioniert diese hoch bewertete Antwort wirklich, wenn Sie bereits eine AUTOINCREMENT-Spalte haben? In den MySQL 5.1-Dokumenten heißt es: "Sie können den Zähler nicht auf einen Wert zurücksetzen, der kleiner oder gleich einem bereits verwendeten Wert ist. Wenn der Wert für MyISAM kleiner oder gleich dem derzeit in der Spalte AUTO_INCREMENT angegebenen Maximalwert ist, wird der Der Wert wird auf das aktuelle Maximum plus eins zurückgesetzt. Wenn der Wert für InnoDB kleiner als der aktuelle Maximalwert in der Spalte ist, tritt kein Fehler auf und der aktuelle Sequenzwert wird nicht geändert. " Klingt so, als würde hier nichts passieren, wenn die
automatische Erhöhung
159
ALTER TABLE tablename AUTO_INCREMENT = 1
boobiq
quelle
7
Darf ich wissen, was der Unterschied zwischen Ihrer Antwort und der vorherigen Antwort ist
Praveen Srinivasan
30
@PraveenSrinivasan kein Unterschied, wir haben sie zur gleichen Zeit hinzugefügt
Boobiq
79
Persönlich finde ich es schön, dass diese beiden Antworten auf eine AUTO_INCREMENT-Frage eine Parallelitätskollision hatten :-)
Mark Goldfain
@ MarkGoldfain ja das ist es!
ncomputers
Parallelität verursacht MySQL-Race-Bedingung ...
Syamsoul Azrien vor
81
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

Ich denke, das wird es tun

nghiepit
quelle
2
Diese Frage hat bereits eine angemessene Antwort. Außerdem UPDATEaktualisieren Sie alle Werte in der idSpalte.
Kermit
2
Das OP gibt nicht an, dass vorhandene Zeilen neu angeordnet werden.
Kermit
Vollständige und perfekte Antwort. Aber ich habe Zweifel, dass, wenn wir einen neuen Wert einfügen, was die PK dieses Wertes sein wird. Ob es 1 oder die nächste PK ist?
Prifulnath
Ja, dies ist die beste Lösung, aber Sie möchten möglicherweise Tabellen sperren, wenn Daten geschrieben werden, z. B. Produktionstabellen
Wellen
Sehr hilfreich, ich hatte die gleiche Anforderung, bei der ich das automatische Inkrement zurücksetzen musste, um mit 1 zu beginnen. Nur die ersten beiden Befehle halfen.
LOKENDRA
40

Geben Sie hier die Bildbeschreibung einMit phpmyadmin gibt es eine sehr einfache Möglichkeit, auf der Registerkarte "Operationen" in den Tabellenoptionen die automatische Inkrementierung auf die gewünschte Zahl festzulegen.

Miles M.
quelle
Sie müssen den MySQL-Dienst / Server direkt danach neu starten.
Cyber
1
Ich glaube nicht, dass Sie Ihren Server danach neu starten müssen. PhpAdmin führt nur den Befehl aus, um den Inkrementstartpunkt zu ändern.
Kareem
Sie müssen nicht neu starten, es wird ab der nächsten Einfügung wirksam.
IlludiumPu36
36

Die beste Lösung, die für mich funktioniert hat:

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

Es ist schnell, funktioniert mit innoDB und ich muss den aktuellen Maximalwert nicht kennen! Auf diese Weise wird der Auto-Inkrement-Zähler zurückgesetzt und automatisch ab dem vorhandenen Maximalwert gestartet.

Vertrauenswörter
quelle
1
Es wird der Wert NULL auto-inc für information_schema festgelegt. checkSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun
1
Ich habe auf Version 5.6.x getestet und dies hat perfekt funktioniert, und die Abfrage von Kerem Güneş hat den Maximalwert plus eins zurückgegeben, NICHT null, wie angegeben. (Vielleicht wird es nach der ersten Abfrage auf null gesetzt, aber nicht nach der zweiten Abfrage.) Ich glaube, dies ist die beste Lösung für InnoDB.
Frank Forte
Entspricht dem festgelegten expliziten Wert: "Erstellen Sie eine neue Tabelle mit derselben Struktur und demselben neuen Wert für auto_increment und kopieren Sie alle Datensätze aus der ursprünglichen Tabelle. Löschen Sie das Original und benennen Sie den neuen um. Dies kann erhebliche Auswirkungen auf die Leistung (und den Speicherplatz) haben. in Produktionsumgebungen, wenn die Tabelle groß ist. " aber viel schlimmer, weil zweimal vollständige Kopiertabelle benötigt wird.
Enyby
Ich überprüfe, ob dies für die Version funktioniert 5.6.15, während ALTER TABLE tablename AUTO_INCREMENT = 1dies nicht der Fall ist .
Nae
24

Die am besten bewerteten Antworten auf diese Frage empfehlen alle "ALTER yourtable AUTO_INCREMENT = value". Dies funktioniert jedoch nur, wenn valuein der Änderung der aktuelle Maximalwert der Spalte für die automatische Inkrementierung größer ist. Gemäß der MySQL 8-Dokumentation :

Sie können den Zähler nicht auf einen Wert zurücksetzen, der kleiner oder gleich dem aktuell verwendeten Wert ist. Wenn sowohl für InnoDB als auch für MyISAM der Wert kleiner oder gleich dem aktuellen Maximalwert in der Spalte AUTO_INCREMENT ist, wird der Wert auf den aktuellen maximalen Spaltenwert AUTO_INCREMENT plus eins zurückgesetzt.

Im Wesentlichen können Sie AUTO_INCREMENT nur ändern, um den Wert der Autoincrement-Spalte zu erhöhen, und nicht auf 1 zurücksetzen, wie das OP im zweiten Teil der Frage fragt. Informationen zu Optionen, mit denen Sie AUTO_INCREMENT von seinem aktuellen Maximum nach unten setzen können, finden Sie unter Primärschlüssel für automatische Inkrementierung neu anordnen / zurücksetzen .

lreeder
quelle
20

Hinzufügen eines Updates, da sich die Funktionalität in MySQL 5.6 geändert hat. Ab MySQL 5.6 können Sie die einfache ALTER TABLE mit InnoDB verwenden:

ALTER TABLE tablename AUTO_INCREMENT = 1;

Die Dokumente werden aktualisiert, um dies widerzuspiegeln:

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

Meine Tests zeigen auch, dass die Tabelle NICHT kopiert wird, der Wert wird einfach geändert.

SeanN
quelle
19

In der Spalte zum Zurücksetzen der MySQL-Autoincrement-Spalte finden Sie gute Optionen

Beachten Sie, dass ALTER TABLE tablename AUTO_INCREMENT = value;dies für InnoDB nicht funktioniert

Naz
quelle
8
Wie geht das mit InnoDB?
EmptyArsenal
4
Funktioniert gut für mich mit MySQL v 5.6.2
Eddie B
Ich hatte ein ähnliches Problem, bei dem ein Feld für die automatische Inkrementierung nicht zurückgesetzt wurde, nachdem ich Datensätze aus einer Tabelle gelöscht hatte. TRUNCATE scheint funktioniert zu haben. Ich denke, die folgenden Lösungen zum Entfernen von Autoincrement und zum erneuten Anwenden können dazu beitragen, dies zu mildern.
Craig Maloney
@CraigMaloney - DELETE(oder ROLLBACK) stellt keine IDs wieder her. Eine Ausnahme: Nach einem Neustart (oder Absturz) wird die nächste ID berechnet MAX(id)+1, wodurch gelöschte IDs am Ende effektiv wiederhergestellt werden . Ausnahme von der Ausnahme: MySQL 8.0 lässt diese IDs unbenutzt.
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)

Ich habe dies in einigen meiner Skripte verwendet, das ID-Feld wird gelöscht und dann mit den vorherigen Einstellungen wieder hinzugefügt. Alle vorhandenen Felder in der Datenbanktabelle werden mit neuen automatischen Inkrementwerten gefüllt. Dies sollte auch mit InnoDB funktionieren.

Beachten Sie, dass alle Felder in der Tabelle nachgezählt werden und andere IDs haben !!!.

Alin Razvan
quelle
3
Ich hätte gerne so etwas! Aber als zusätzliche Warnung; Dies würde Ihre Fremdschlüssel offensichtlich vollständig beschädigen.
NoobishPro
12

Sie können die Syntaxtabelle auch TRUNCATEfolgendermaßen verwenden: TRUNCATE TABLE table_name

IN ACHT NEHMEN!! TRUNCATE TABLE your_tablewird alles löschen in Ihrem your_table!!

Manohar Kumar
quelle
14
Neue Programmierer , beachten Sie, dass TRUNCATEauch ALLE Ihre Zeilen in der angegebenen Tabelle gelöscht werden !
Zanshin13
1
Der obige Kommentar sollte in die Antwort eingefügt werden oder zumindest eine Erklärung zur tatsächlichen Verwendung von Truncate.
Lucas Kauz
TRUNCATEwerden auch die auto_incrementFelder zurückgesetzt? Mein Anwendungsfall besteht darin, die alten Daten in der Tabelle zu löschen und die IDs für neue Daten erneut von 1 zu starten (stellen Sie sich vor, Sie löschen die Tabelle für die ordnungsgemäße Verwendung nach Abschluss des Tests). Ich dachte ich müsste DROPden ganzen Tisch und CREATEes wieder.
ADTC
Ja, TRUNCATE funktioniert wie ein Reset auf dem Tisch. Dies ist nicht ganz richtig, wenn eine Tabelle seit ihrer Erstellung geändert wurde, werden diese Änderungen nicht zurückgesetzt. Ich nehme an, es ist näher am Exportieren der Tabellenstruktur und am Verwenden des Exports zum Erstellen einer neuen Tabelle als beim tatsächlichen Zurücksetzen.
Chris
Ja @ADTC. Wenn Sie wollen , halten den aktuellen auto_incrementWert, verwenden DELETE FROMstatt TRUNCATE.
TRiG
8

es ist für leere Tabelle:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

Wenn Sie Daten haben, diese aber aufräumen möchten, empfehle ich Folgendes:

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
quelle
einfach zu bedienen
Abdul Aziz Al Basyir
Dies funktionierte bei uns mit Daten. Die Zeile wird auf den nächsten Index zurückgesetzt. Vielen Dank!
Dazzle
urwell @Dazzle!
Abdul Aziz Al Basyir
5

Hier ist meine Lösung, aber ich rate nicht dazu, wenn Ihre Spalte Einschränkungen aufweist oder als Fremdschlüssel mit anderen Tabellen verbunden ist, da dies negative Auswirkungen hätte oder nicht einmal funktioniert.

> Zuerst: Löschen Sie die Spalte

ALTER TABLE tbl_name DROP COLUMN column_id

> Zweitens: Erstellen Sie die Spalte neu und legen Sie sie als ERSTE fest, wenn Sie sie als erste Spalte verwenden möchten.

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

Das funktioniert gut!

bdalina
quelle
3

Ab MySQL 5.6 funktioniert der folgende Ansatz aufgrund von Online-DDL schneller (Hinweis algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;

artsafin
quelle
2

Sie können die Tabelle einfach abschneiden, um die Sequenz zurückzusetzen

TRUNCATE TABLE TABLE_NAME
Kunwar Babu
quelle
1

Ich habe versucht, die Tabelle zu ändern und auto_increment auf 1 zu setzen, aber es hat nicht funktioniert. Ich habe beschlossen, den inkrementierten Spaltennamen zu löschen, dann eine neue Spalte mit Ihrem bevorzugten Namen zu erstellen und diese neue Spalte von Anfang an auf Inkrement zu setzen.

Andromeda
quelle
Können Sie erklären, wie Sie das möglich gemacht haben?
MZaragoza
@MZaragoza Löschen Sie einfach die alte Spalte ohne KI und erstellen Sie eine neue Spalte mit aktivierter KI.
Andromeda
Können Sie Ihre Antwort aktualisieren, um dies anzuzeigen? Ich würde es wirklich schätzen
MZaragoza
1

Der automatische Inkrementzähler für eine Tabelle kann auf zwei Arten (neu) eingestellt werden:

  1. Durch Ausführen einer Abfrage, wie andere bereits erklärt:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. Verwenden von Workbench oder einem anderen Tool zum Entwerfen visueller Datenbanken. Ich werde in Workbench zeigen, wie es gemacht wird - aber es sollte auch in anderen Tools nicht viel anders sein. Klicken Sie mit der rechten Maustaste auf die gewünschte Tabelle und wählen Sie Alter tableaus dem Kontextmenü. Unten sehen Sie alle verfügbaren Optionen zum Ändern einer Tabelle. Wählen Sie Optionsund Sie erhalten dieses Formular: Geben Sie hier die Bildbeschreibung ein

    Stellen Sie dann einfach den gewünschten Wert in das Feld ein, Auto incrementwie im Bild gezeigt. Dadurch wird im Wesentlichen die in der ersten Option gezeigte Abfrage ausgeführt.

Kristijan Iliev
quelle
0

So aktualisieren Sie die neueste plus eine ID

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

ALTER TABLE Tabellenname AUTO_INCREMENT = 1

Santosh Mahule
quelle
0

Ich habe gegoogelt und diese Frage gefunden, aber die Antwort, nach der ich wirklich suche, erfüllt zwei Kriterien:

  1. mit rein MySQL-Abfragen
  2. Setzen Sie eine vorhandene Tabelle automatisch auf max (id) + 1 zurück

Da ich hier nicht genau das finden konnte, was ich will, habe ich die Antwort aus verschiedenen Antworten zusammengeschustert und hier geteilt.

Einige Dinge zu beachten:

  1. Die fragliche Tabelle ist InnoDB
  2. Die Tabelle verwendet das Feld idmit dem Typ intals Primärschlüssel
  3. Die einzige Möglichkeit, dies nur in MySQL zu tun, ist die Verwendung einer gespeicherten Prozedur
  4. Meine Bilder unten verwenden SequelPro als GUI. Sie sollten es basierend auf Ihrem bevorzugten MySQL-Editor anpassen können
  5. Ich habe dies auf MySQL Ver 14.14 Distrib 5.5.61 für debian-linux-gnu getestet

Schritt 1: Gespeicherte Prozedur erstellen

Erstellen Sie eine gespeicherte Prozedur wie folgt:

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 ;

Dann führen Sie es aus.

Vor dem Ausführen sieht es so aus, wenn Sie in Ihrer Datenbank unter Gespeicherte Prozeduren nachsehen.

Geben Sie hier die Bildbeschreibung ein

Wenn ich laufe, wähle ich einfach die gespeicherte Prozedur aus und drücke Auswahl ausführen

Geben Sie hier die Bildbeschreibung ein

Hinweis: Der Teil der Begrenzer ist entscheidend. Wenn Sie also die oben ausgewählten Antworten in dieser Frage kopieren und einfügen, funktionieren sie aus diesem Grund normalerweise nicht.

Nachdem ich ausgeführt habe, sollte ich die gespeicherte Prozedur sehen

Geben Sie hier die Bildbeschreibung ein

Wenn Sie die gespeicherte Prozedur ändern müssen, müssen Sie die gespeicherte Prozedur löschen und dann auswählen, um sie erneut auszuführen.

Schritt 2: Rufen Sie die gespeicherte Prozedur auf

Dieses Mal können Sie einfach normale MySQL-Abfragen verwenden.

call reset_autoincrement('products');

Ursprünglich aus meinen eigenen SQL-Abfragen in https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc und angepasst für StackOverflow

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

Versuchen Sie, diese Abfrage auszuführen

 ALTER TABLE tablename AUTO_INCREMENT = value;

Oder versuchen Sie diese Abfrage für das automatische Zurücksetzen inkrementieren

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

Stellen Sie Auto Increment ein und führen Sie diese Abfrage aus

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

Ich empfehle Ihnen, zum Abfragebrowser zu gehen und Folgendes zu tun:

  1. Gehen Sie zu Schemata und suchen Sie die Tabelle, die Sie ändern möchten.
  2. Klicken Sie mit der rechten Maustaste und wählen Sie Kopie erstellen Anweisung.
  3. Öffnen Sie eine Ergebnisregisterkarte und fügen Sie die create-Anweisung ein.
  4. Gehen Sie zur letzten Zeile der create-Anweisung und suchen Sie nach Auto_Increment = N (wobei N eine aktuelle Zahl für das Feld auto_increment ist.)
  5. Ersetzen Sie N durch 1.
  6. Drücken Sie ctrl+enter .

Auto_increment sollte auf eins zurückgesetzt werden, sobald Sie eine neue Zeile in die Tabelle eingeben.

Ich weiß nicht, was passieren wird, wenn Sie versuchen, eine Zeile hinzuzufügen, in der bereits ein Feldwert für auto_increment vorhanden ist.

Ich hoffe das hilft!

Jesus
quelle
-2

Am besten entfernen Sie das Feld mit AI und fügen es mit AI erneut hinzu. Funktioniert für alle Tabellen

Mürrisch
quelle
1
Nicht der beste Weg überhaupt, das
Löschen