Jak zresetować AUTO_INCREMENT w MySQL?

1245

Jak mogę zresetowaćAUTO_INCREMENT pola?
Chcę, żeby 1znów zaczęło odliczać .

Homerun
źródło
9
Możesz uzyskać lepszą odpowiedź na stronie dla DBA na dba.stackexchange.com
Rowland Shaw
80
Prawdopodobnie zechcesz też opróżnić stół:TRUNCATE TABLE yourTableName;
Konerak,
3
tak, w tym przypadku najlepiej jest obciąć tabelę. resetuje również automatyczny przyrost początkowy do 1.
raidsan
2
Czasami nie masz uprawnień do TRUNCATE, ponieważ wymaga to uprawnień DROP.
Luke Cousins

Odpowiedzi:

2024

Możesz zresetować licznik za pomocą:

ALTER TABLE tablename AUTO_INCREMENT = 1

W przypadku InnoDB nie można ustawić auto_incrementwartości niższej lub równej najwyższemu bieżącemu indeksowi. (cytat z ViralPatel ):

Należy pamiętać, że nie można zresetować licznika do wartości mniejszej lub równej żadnej, która została już użyta. W przypadku MyISAM, jeśli wartość jest mniejsza lub równa maksymalnej wartości obecnie w kolumnie AUTO_INCREMENT, wartość jest resetowana do bieżącej wartości maksymalnej plus jeden. W przypadku InnoDB, jeśli wartość jest mniejsza niż bieżąca maksymalna wartość w kolumnie, nie wystąpi błąd i bieżąca wartość sekwencji nie zostanie zmieniona.

Zobacz Jak zresetować autowzrost MySQL przy użyciu wartości MAX z innej tabeli? na temat tego, jak dynamicznie uzyskać akceptowalną wartość.

Niels
źródło
8
Może to trwać wiecznie dla zapełnionego stołu. Bądź ostrożny z tym: stackoverflow.com/questions/2681869/…
BT
52
jest tocircular reference
Besnik
5
Co masz na myśli curcular reference?
Niels
73
Pamiętaj, że MySql utworzy nową tabelę o tej samej strukturze i nowej wartości auto_increment i skopiuje wszystkie rekordy z oryginalnej tabeli, upuści oryginał i zmieni nazwę na nową. Może to mieć znaczny wpływ na wydajność (i miejsce na dysku) w środowiskach produkcyjnych, jeśli tabela jest duża.
Rostol
6
Czy ta wysoko głosowana odpowiedź naprawdę działa, jeśli masz już kolumnę AUTOINCREMENT? Zgodnie z dokumentacją MySQL 5.1: „Nie można zresetować licznika do wartości mniejszej lub równej żadnej, która została już użyta. W przypadku MyISAM, jeśli wartość jest mniejsza lub równa maksymalnej wartości obecnie w kolumnie AUTO_INCREMENT, właściwość wartość jest resetowana do aktualnego maksimum plus jeden. W przypadku InnoDB, jeśli wartość jest mniejsza niż bieżąca maksymalna wartość w kolumnie, nie występuje błąd i bieżąca wartość sekwencji nie jest zmieniana. ” Wygląda na to, że nic się tutaj nie wydarzy, jeśli autoinkrementacja jest większa niż 1.
lreeder
159
ALTER TABLE tablename AUTO_INCREMENT = 1
boobiq
źródło
7
Czy mogę wiedzieć, jaka jest różnica między twoją odpowiedzią a poprzednią odpowiedzią
Praveen Srinivasan
30
@PraveenSrinivasan bez różnicy, dodaliśmy je w tym samym czasie
boobiq
79
Osobiście uważam, że to piękne, że te dwie odpowiedzi na pytanie AUTO_INCREMENT miały kolizję :-)
Mark Goldfain
@MarkGoldfain tak to jest!
ncomputers,
współbieżność spowoduje warunek wyścigu mysql ...
Syamsoul Azrien
81
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

Myślę, że to zrobi

nghiepit
źródło
2
To pytanie ma już odpowiednią odpowiedź. Ponadto UPDATEzaktualizujesz wszystkie wartości w idkolumnie.
Kermit
2
OP nie stwierdza, że ​​ponownie porządkuje istniejące wiersze.
Kermit
Pełna i idealna odpowiedź. Ale mam wątpliwości, że kiedy wstawimy nową wartość, to będzie PK tej wartości. Czy to jest 1 czy następny PK?
Prifulnath
tak, to najlepsze rozwiązanie, ale możesz chcieć zablokować tabele, jeśli zapisywane są dane, np. tabele produkcyjne
wavvves
bardzo pomocne, miałem to samo wymaganie, w którym musiałem zresetować auto-inkrement, aby zacząć od 1, pomogły tylko dwie pierwsze komendy.
LOKENDRA
40

wprowadź opis zdjęcia tutajJest bardzo łatwy sposób z phpmyadmin w zakładce „operacje”, możesz ustawić, w opcjach tabeli, auto-wzrost do żądanej liczby.

Miles M.
źródło
Następnie musisz ponownie uruchomić usługę / serwer mysql.
Cyber
1
Nie sądzę, że musisz potem zrestartować serwer. PhpAdmin po prostu uruchomi polecenie, aby zmienić punkt początkowy przyrostu.
Kareem,
Nie trzeba ponownie uruchamiać, zacznie obowiązywać od następnej wstawki.
IlludiumPu36
36

Najlepsze rozwiązanie, które dla mnie zadziałało:

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

Jest szybki, współpracuje z innoDB i nie muszę znać bieżącej wartości maksymalnej! W ten sposób licznik automatycznego przyrostu zostanie zresetowany i uruchomi się automatycznie od wartości maksymalnej.

trust_words
źródło
1
ustawi wartość NULL auto-inc na information_schema; sprawdźSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun
1
Testowałem na wersji 5.6.x i działało to doskonale, a zapytanie Kerem Güneş zwróciło wartość maksymalną plus jeden, NIE jak podano, zerową. (może jest ustawiony na zero po pierwszym zapytaniu, ale nie jest po drugim zapytaniu) Uważam, że jest to najlepsze rozwiązanie dla InnoDB.
Frank Forte
To samo, co ustawiona wartość jawna: „utwórz nową tabelę o tej samej strukturze i nowej wartości auto_increment i skopiuj wszystkie rekordy z oryginalnej tabeli, upuść oryginał i zmień nazwę nowej. Może to mieć znaczny wpływ na wydajność (i miejsce na dysku) w środowiskach produkcyjnych, jeśli stół jest duży. ” ale znacznie gorzej, ponieważ dwa razy potrzebuję pełnej tabeli kopiowania.
Enyby,
Sprawdzam, czy to działa w przypadku wersji 5.6.15, podczas ALTER TABLE tablename AUTO_INCREMENT = 1gdy nie .
Nae
24

Najwyżej ocenione odpowiedzi na to pytanie zalecają „ZMIENIJ swój stół AUTO_INCREMENT = wartość”. Działa to jednak tylko wtedy, gdy valuezmiana jest większa niż bieżąca maksymalna wartość kolumny autowzrostu. Zgodnie z dokumentacją MySQL 8 :

Nie można zresetować licznika do wartości mniejszej lub równej aktualnie używanej wartości. Zarówno w przypadku InnoDB, jak i MyISAM, jeśli wartość jest mniejsza lub równa maksymalnej wartości obecnie w kolumnie AUTO_INCREMENT, wartość jest resetowana do bieżącej maksymalnej wartości kolumny AUTO_INCREMENT plus jeden.

Zasadniczo możesz zmienić AUTO_INCREMENT tylko w celu zwiększenia wartości kolumny autowzrostu, a nie resetować jej do 1, jak OP pyta w drugiej części pytania. Aby uzyskać opcje, które faktycznie pozwalają ustawić AUTO_INCREMENT w dół od jego aktualnego maksimum, spójrz na klucz główny Zmień kolejność / zeruj auto-przyrost .

leder
źródło
20

Dodanie aktualizacji, ponieważ zmieniono funkcjonalność w MySQL 5.6. Począwszy od MySQL 5.6, możesz używać prostego ALTER TABLE z InnoDB:

ALTER TABLE tablename AUTO_INCREMENT = 1;

Dokumenty są aktualizowane, aby odzwierciedlić to:

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

Moje testy pokazują również, że tabela NIE jest kopiowana, wartość jest po prostu zmieniana.

SeanN
źródło
19

Istnieją dobre opcje podane w artykule Jak zresetować kolumnę Autoinkrementacji MySQL

Należy pamiętać, że ALTER TABLE tablename AUTO_INCREMENT = value;ma nie pracować dla InnoDB

Naz
źródło
8
Jak to zrobić za pomocą InnoDB?
EmptyArsenal
4
Działa dobrze dla mnie przy użyciu MySQL v 5.6.2
Eddie B
Miałem podobny problem polegający na tym, że pole autoakrementacji nie było resetowane po usunięciu rekordów z tabeli. Wygląda na to, że TRUNCATE działało. Myślę, że poniższe rozwiązania dotyczące usuwania autoinkrementacji, a następnie ponownego zastosowania mogą pomóc w złagodzeniu tego.
Craig Maloney
@CraigMaloney - DELETE(lub ROLLBACK) nie odzyska identyfikatorów. Jeden wyjątek: po restarcie (lub awarii) obliczany jest następny identyfikator MAX(id)+1, dzięki czemu skutecznie odzyskuje usunięte identyfikatory na końcu . Wyjątek od wyjątku: MySQL 8.0 pozostawia te identyfikatory nieużywane.
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)

Użyłem tego w niektórych moich skryptach, pole id jest usuwane, a następnie dodawane z poprzednimi ustawieniami, wszystkie istniejące pola w tabeli bazy danych są wypełniane nowymi wartościami automatycznego przyrostu, powinno to również działać z InnoDB.

Pamiętaj, że wszystkie pola w tabeli zostaną przeliczone i będą miały inne identyfikatory !!!

Alin Razvan
źródło
3
Chciałbym mieć coś takiego! Ale jako dodatkowe ostrzeżenie; to oczywiście całkowicie złamałoby twoje klucze obce.
NoobishPro
12

Możesz także użyć TRUNCATEtabeli składni w następujący sposób: TRUNCATE TABLE table_name

STRZEC SIĘ!! TRUNCATE TABLE your_tablebędzie usunąć wszystko w twoich your_table!!

Manohar Kumar
źródło
14
Nowe programiści , należy pamiętać, że TRUNCATEbędzie również usunięcie wszystkich wierszy w określonej tabeli!
Zanshin13,
1
Powyższy komentarz należy wstawić do odpowiedzi lub przynajmniej wyjaśnienie dotyczące faktycznego zastosowania obcięcia.
Lucas Kauz,
TRUNCATEzresetuje też auto_incrementpola? Moim przypadkiem użycia jest wyczyszczenie starych danych w tabeli i ponowne uruchomienie identyfikatorów od 1 dla nowych danych (wyobraź sobie, wyczyść tabelę do prawidłowego użycia po zakończeniu testowania). Pomyślałem, że będę musiał DROPcały stół i CREATEjeszcze raz.
ADTC
Tak, TRUNCATE działa jak reset na stole. Nie jest to do końca prawdą, jeśli tabela została ZMIENIONA od czasu jej utworzenia, wówczas zmiany nie zostaną zresetowane. Podejrzewam, że jest to bliższe eksportowaniu struktury tabeli i wykorzystaniu eksportu do utworzenia nowej tabeli niż faktyczne resetowanie.
Chris
Tak @ADTC. Jeśli chcesz zachować bieżącą auto_incrementwartość, użyj DELETE FROMzamiast TRUNCATE.
TRiG
8

dotyczy pustej tabeli:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

jeśli masz dane, ale chcesz je uporządkować, polecam użyć tego:

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
źródło
prosty w użyciu
Abdul Aziz Al Basyir
To działało dla nas z danymi. Resetuje wiersz do następnego indeksu. Dzięki!
Dazzle
urwell @Dazzle!
Abdul Aziz Al Basyir
5

Oto moje rozwiązanie, ale nie radzę tego robić, jeśli kolumna ma ograniczenia lub jest połączona jako klucz obcy z innymi tabelami, ponieważ miałoby to złe skutki lub nawet nie działałoby.

> Najpierw: upuść kolumnę

ALTER TABLE tbl_name DROP COLUMN column_id

> Drugi: odtwórz kolumnę i ustaw ją jako PIERWSZĄ, jeśli chcesz, aby była pierwszą kolumną, którą zakładam.

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

To działa dobrze!

bdalina
źródło
3

Począwszy od MySQL 5.6, poniższe podejście działa szybciej ze względu na DDL online (uwaga algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;

artsafin
źródło
2

Możesz po prostu obciąć tabelę, aby zresetować sekwencję

TRUNCATE TABLE TABLE_NAME
Kunwar Babu
źródło
1

Próbowałem zmienić tabelę i ustawić auto_increment na 1, ale to nie działało. Postanowiłem usunąć nazwę kolumny, którą zwiększałem, a następnie utwórz nową kolumnę z preferowaną nazwą i ustaw nową kolumnę na zwiększenie od początku.

Andromeda
źródło
czy możesz wyjaśnić, jak to się stało?
MZaragoza,
@MZaragoza Po prostu upuść starą kolumnę bez AI, a następnie utwórz nową z włączoną AI.
andromeda,
Czy możesz zaktualizować swoją odpowiedź, aby to pokazać. Byłbym naprawdę wdzięczny
MZaragoza,
1

Licznik automatycznego przyrostu dla tabeli można (ponownie) ustawić na dwa sposoby:

  1. Wykonując zapytanie, podobnie jak inni już wyjaśnili:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. Korzystanie z Workbench lub innego wizualnego narzędzia do projektowania baz danych. Pokażę w Workbench, jak to się robi - ale w innych narzędziach też nie powinno być inaczej. Kliknij prawym przyciskiem myszy żądaną tabelę i wybierz Alter tablez menu kontekstowego. Na dole możesz zobaczyć wszystkie dostępne opcje zmiany tabeli. Wybierz, Optionsa otrzymasz ten formularz: wprowadź opis zdjęcia tutaj

    Następnie ustaw żądaną wartość w polu, Auto incrementjak pokazano na obrazku. Spowoduje to w zasadzie wykonanie zapytania pokazanego w pierwszej opcji.

Kristijan Iliev
źródło
0

Aby zaktualizować najnowszy plus jeden identyfikator

 ALTER TABLE table_name AUTO_INCREMENT = 
 (SELECT (id+1) id FROM table_name order by id desc limit 1);
narasimharaosp
źródło
0

ALTER TABLE tablename AUTO_INCREMENT = 1

Santosh Mahomet
źródło
0

Poszukałem go i znalazłem to pytanie, ale odpowiedź, której tak naprawdę szukam, spełnia dwa kryteria:

  1. używając wyłącznie zapytań MySQL
  2. zresetuj istniejącą automatyczną inkrementację tabeli do maks. (id) + 1

Ponieważ nie mogłem znaleźć dokładnie tego, czego chcę tutaj, wybrałem odpowiedź z różnych odpowiedzi i udostępniłem ją tutaj.

Kilka rzeczy do zapamiętania:

  1. przedmiotowa tabela to InnoDB
  2. tabela używa pola idz typem asint kluczem podstawowym
  3. jedynym sposobem na zrobienie tego wyłącznie w MySQL jest użycie procedury składowanej
  4. moje obrazy poniżej używają SequelPro jako GUI. Powinieneś być w stanie dostosować go w oparciu o preferowany edytor MySQL
  5. Przetestowałem to na MySQL Ver.14.14 Distrib 5.5.61, dla debian-linux-gnu

Krok 1: Utwórz procedurę składowaną

Utwórz procedurę składowaną w następujący sposób:

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 ;

Następnie uruchom.

Przed uruchomieniem wygląda to tak, gdy zajrzysz do Procedur składowanych w bazie danych.

wprowadź opis zdjęcia tutaj

Kiedy uruchamiam, po prostu wybieram procedurę przechowywaną i wciskam Uruchom zaznaczenie

wprowadź opis zdjęcia tutaj

Uwaga: część ograniczników ma kluczowe znaczenie. Dlatego jeśli skopiujesz i wkleisz z najlepszych odpowiedzi w tym pytaniu, zwykle nie działają one z tego powodu.

Po uruchomieniu powinienem zobaczyć procedurę przechowywaną

wprowadź opis zdjęcia tutaj

Jeśli chcesz zmienić procedurę przechowywaną, musisz usunąć procedurę przechowywaną, a następnie wybierz opcję ponownego uruchomienia.

Krok 2: Wywołaj procedurę przechowywaną

Tym razem możesz po prostu użyć zwykłych zapytań MySQL.

call reset_autoincrement('products');

Pierwotnie z własnych notatek dotyczących zapytań SQL w https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc i przystosowanych do StackOverflow

Kim Stacks
źródło
0
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
Mihai Galan
źródło
-1

Spróbuj uruchomić to zapytanie

 ALTER TABLE tablename AUTO_INCREMENT = value;

Lub wypróbuj to zapytanie, aby zresetować automatyczny przyrost

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

I ustaw automatyczny przyrost, a następnie uruchom to zapytanie

  ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
Shabeer Sha
źródło
-2

Sugeruję, aby przejść do przeglądarki zapytań i wykonać następujące czynności:

  1. Przejdź do schematów i znajdź tabelę, którą chcesz zmienić.
  2. Kliknij prawym przyciskiem myszy i wybierz polecenie kopiuj Utwórz instrukcję.
  3. Otwórz kartę wyników i wklej instrukcję tworzenia ich.
  4. Przejdź do ostatniego wiersza instrukcji create i poszukaj Auto_Increment = N, (gdzie N jest bieżącą liczbą w polu auto_increment).
  5. Zamień N na 1.
  6. Naciśnij ctrl+enter .

Auto_increment powinno zostać zresetowane do jednego po wprowadzeniu nowego wiersza w tabeli.

Nie wiem, co się stanie, jeśli spróbujesz dodać wiersz, w którym już istnieje wartość pola auto_increment.

Mam nadzieję, że to pomoże!

jeson
źródło
-2

Najlepszym sposobem jest usunięcie pola za pomocą AI i dodanie go ponownie za pomocą AI, działa dla wszystkich tabel

Gderliwy
źródło
1
wcale nie najlepszy sposób, upuszczenie kolumny spowoduje utratę danych kolumny
Disha Goyal