Wie kann ich das eines Feldes zurücksetzenAUTO_INCREMENT
?
Ich möchte, dass es wieder anfängt zu zählen 1
.
TRUNCATE TABLE yourTableName;
Wie kann ich das eines Feldes zurücksetzenAUTO_INCREMENT
?
Ich möchte, dass es wieder anfängt zu zählen 1
.
TRUNCATE TABLE yourTableName;
Antworten:
Sie können den Zähler zurücksetzen mit:
ALTER TABLE tablename AUTO_INCREMENT = 1
Für InnoDB können Sie den auto_increment
Wert 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.
circular reference
curcular reference
?
ALTER TABLE tablename AUTO_INCREMENT = 1
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
Ich denke, das wird es tun
UPDATE
aktualisieren Sie alle Werte in der id
Spalte.
Einfach so:
ALTER TABLE tablename AUTO_INCREMENT = value;
Referenz: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
reset
bedeutet, es auf den Standardwert zu setzen ... damit Sie "Wert" durch 1 ersetzen können
Mit phpmyadmin gibt es eine sehr einfache Möglichkeit, auf der Registerkarte "Operationen" in den Tabellenoptionen die automatische Inkrementierung auf die gewünschte Zahl festzulegen.
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.
SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
5.6.15
, während ALTER TABLE tablename AUTO_INCREMENT = 1
dies nicht der Fall ist .
Die am besten bewerteten Antworten auf diese Frage empfehlen alle "ALTER yourtable AUTO_INCREMENT = value". Dies funktioniert jedoch nur, wenn value
in 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 .
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.
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
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.
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 !!!.
Sie können die Syntaxtabelle auch TRUNCATE
folgendermaßen verwenden:
TRUNCATE TABLE table_name
IN ACHT NEHMEN!! TRUNCATE TABLE your_table
wird alles löschen in Ihrem your_table
!!
TRUNCATE
auch ALLE Ihre Zeilen in der angegebenen Tabelle gelöscht werden !
TRUNCATE
werden auch die auto_increment
Felder 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 DROP
den ganzen Tisch und CREATE
es wieder.
auto_increment
Wert, verwenden DELETE FROM
statt TRUNCATE
.
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`);
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.
ALTER TABLE tbl_name DROP COLUMN column_id
ALTER TABLE tbl_access ADD COLUMN `access_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST
Das funktioniert gut!
Ab MySQL 5.6 funktioniert der folgende Ansatz aufgrund von Online-DDL schneller (Hinweis algorithm=inplace
):
alter table tablename auto_increment=1, algorithm=inplace;
Sie können die Tabelle einfach abschneiden, um die Sequenz zurückzusetzen
TRUNCATE TABLE TABLE_NAME
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.
Der automatische Inkrementzähler für eine Tabelle kann auf zwei Arten (neu) eingestellt werden:
Durch Ausführen einer Abfrage, wie andere bereits erklärt:
ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;
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 table
aus dem Kontextmenü. Unten sehen Sie alle verfügbaren Optionen zum Ändern einer Tabelle. Wählen Sie Options
und Sie erhalten dieses Formular:
Stellen Sie dann einfach den gewünschten Wert in das Feld ein, Auto increment
wie im Bild gezeigt. Dadurch wird im Wesentlichen die in der ersten Option gezeigte Abfrage ausgeführt.
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);
ALTER TABLE Tabellenname AUTO_INCREMENT = 1
Ich habe gegoogelt und diese Frage gefunden, aber die Antwort, nach der ich wirklich suche, erfüllt zwei Kriterien:
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:
id
mit dem Typ int
als PrimärschlüsselErstellen 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.
Wenn ich laufe, wähle ich einfach die gespeicherte Prozedur aus und drücke Auswahl ausführen
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
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.
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
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =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;
Ich empfehle Ihnen, zum Abfragebrowser zu gehen und Folgendes zu tun:
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!