Как сбросить AUTO_INCREMENT в MySQL?


1246

Как я могу сброситьAUTO_INCREMENT поле?
Я хочу, чтобы он снова начал считать 1.


9
Вы можете получить лучший ответ на сайте для администраторов баз данных по адресу dba.stackexchange.com
Роуланд Шоу,

80
Вы, вероятно, захотите очистить стол тоже:TRUNCATE TABLE yourTableName;
Конерак


3
да, в этом случае лучше всего использовать усеченную таблицу. он также сбрасывает старт автоинкремента на 1.
raidsan

2
Иногда у вас нет разрешения на TRUNCATE, так как для этого требуются разрешения DROP.
Люк Кузен

Ответы:


2025

Вы можете сбросить счетчик с помощью:

ALTER TABLE tablename AUTO_INCREMENT = 1

Для InnoDB вы не можете установить auto_incrementзначение ниже или равно наибольшему текущему индексу. (цитата из ViralPatel ):

Обратите внимание, что вы не можете сбросить счетчик до значения, которое меньше или равно значению, которое уже использовалось. Для MyISAM, если значение меньше или равно максимальному значению, которое в данный момент находится в столбце AUTO_INCREMENT, значение сбрасывается до текущего максимального плюс один. Для InnoDB, если значение меньше текущего максимального значения в столбце, ошибка не возникает и текущее значение последовательности не изменяется.

См. Как сбросить автоинкремент MySQL, используя значение MAX из другой таблицы? о том, как динамически получить приемлемое значение.


8
Это может занять вечность за заполненным столом. Будьте осторожны с этим: stackoverflow.com/questions/2681869/…
BT

52
этоcircular reference
Бесник,

5
Что вы имеете в виду curcular reference?
Нильс

73
Имейте в виду, что MySql создаст новую таблицу с той же структурой и новым значением auto_increment и скопирует все записи из исходной таблицы, удалит оригинал и переименует новую. Это может оказать значительное влияние на производительность (и дисковое пространство) в производственных средах, если таблица большая.
Ростол

6
Действительно ли этот высоко оцененный ответ действительно работает, если у вас уже есть столбец AUTOINCREMENT? Согласно документации MySQL 5.1: «Вы не можете сбросить счетчик до значения, которое меньше или равно любому, которое уже использовалось. Для MyISAM, если значение меньше или равно максимальному значению, которое в настоящее время находится в столбце AUTO_INCREMENT, значение сбрасывается до текущего максимального значения плюс 1. Для InnoDB, если значение меньше текущего максимального значения в столбце, ошибки не возникает и текущее значение последовательности не изменяется. " Похоже, ничего не произойдет, если автоинкремент больше 1.
владелец

160
ALTER TABLE tablename AUTO_INCREMENT = 1

7
Могу ли я узнать, в чем разница между вашим ответом и предыдущим ответом
Правин Шринивасан

30
@PraveenSrinivasan без разницы, мы добавили их одновременно
boobiq

79
Лично я думаю, что это прекрасно, что эти два ответа на вопрос AUTO_INCREMENT столкнулись с параллелизмом :-)
Марк

@MarkGoldfain да, это так!
ncomputers

параллелизм вызовет состояние гонки MySQL ...
Syamsoul Azrien

81
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

Я думаю, что это сделает


2
На этот вопрос уже есть соответствующий ответ. Далее вы UPDATEобновите все значения в idстолбце.
Кермит

2
OP не утверждает, что они переупорядочивают существующие строки.
Кермит,

Полный и идеальный ответ. Но я сомневаюсь, что когда мы добавляем новое значение, то каким будет PK этого значения. Будь то 1 или следующий ПК?
Прифулнат

да, это лучшее решение, но вы можете заблокировать таблицы, если
записываются

очень полезно, у меня было то же самое требование, где я должен был сбросить автоинкремент, чтобы начать с 1, помогли только первые две команды.
ЛОКЕНДРА


40

введите описание изображения здесьЕсть очень простой способ с phpmyadmin на вкладке «операции», вы можете установить в настройках таблицы автоинкремент на нужное вам число.


Вам нужно перезапустить службу / сервер mysql сразу после этого.
Cyber

1
Я не думаю, что вам нужно перезагрузить сервер после этого. PhpAdmin просто запустит команду для изменения начальной точки приращения.
Карим

Вам не нужно перезапускать, это вступает в силу со следующей вставки.
IlludiumPu36

36

Лучшее решение, которое сработало для меня:

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

Это быстро, работает с innoDB, и мне не нужно знать текущее максимальное значение! Таким образом, автоматический счетчик приращений будет сброшен и будет запускаться автоматически с существующего максимального значения.


1
он установит значение NULL auto-inc для information_schema; проверкаSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun

1
Я протестировал на версии 5.6.x, и это сработало отлично, и запрос Керема Гюнеша вернул максимальное значение плюс один, а НЕ ноль, как указано. (может быть, он установлен в null после первого запроса, но не после второго запроса) Я считаю, что это лучшее решение для InnoDB.
Фрэнк Форте

Аналогично заданному явному значению: «создайте новую таблицу с той же структурой и новым значением auto_increment и скопируйте все записи из исходной таблицы, удалите оригинал и переименуйте новую. Это может оказать значительное влияние на производительность (и дисковое пространство) в производственной среде, если стол большой. " но намного хуже, потому что нужна полная копия таблицы два раза.
Enyby

Я подтверждаю , что это работает для версии 5.6.15, в то время как ALTER TABLE tablename AUTO_INCREMENT = 1делает не .
Nae

24

Ответы на этот вопрос с наивысшей оценкой рекомендуют «ALTER yourtable AUTO_INCREMENT = value». Однако это работает только тогда, когда valueзначение alter превышает текущее максимальное значение столбца автоинкремента. Согласно документации MySQL 8 :

Вы не можете сбросить счетчик до значения, которое меньше или равно значению, которое используется в данный момент. Как для InnoDB, так и для MyISAM, если значение меньше или равно максимальному значению, которое в настоящее время находится в столбце AUTO_INCREMENT, значение сбрасывается до текущего максимального значения столбца AUTO_INCREMENT плюс один.

По сути, вы можете изменить только AUTO_INCREMENT, чтобы увеличить значение столбца автоинкремента, но не сбросить его до 1, как задает ОП во второй части вопроса. Для параметров, которые фактически позволяют вам установить AUTO_INCREMENT вниз от его текущего максимума, взгляните на Переупорядочить / сбросить первичный ключ с автоматическим приращением .


20

Добавление обновления, потому что функциональность изменилась в MySQL 5.6. Начиная с MySQL 5.6, вы можете использовать простую ALTER TABLE с InnoDB:

ALTER TABLE tablename AUTO_INCREMENT = 1;

Документы обновлены, чтобы отразить это:

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

Мое тестирование также показывает, что таблица НЕ копируется, значение просто изменяется.


19

В разделе « Как сбросить колонку автоинкремента MySQL» приведены хорошие параметры.

Обратите внимание , что ALTER TABLE tablename AUTO_INCREMENT = value;это не работает для InnoDB


8
Вы как это сделать с InnoDB?
EmptyArsenal

4
Хорошо работает для меня, используя MySQL v 5.6.2
Eddie B

У меня была похожая проблема, когда поле автоинкремента не сбрасывалось после удаления записей из таблицы. TRUNCATE, похоже, сработало. Я думаю, что приведенные ниже решения для удаления автоинкремента и последующего повторного применения могут помочь облегчить это.
Крейг Малони

@CraigMaloney - DELETE(или ROLLBACK) не будет восстанавливать идентификаторы. Одно исключение: после перезапуска (или сбоя) вычисляется следующий идентификатор MAX(id)+1, тем самым эффективно восстанавливая удаленные идентификаторы в конце . Исключение за исключением: MySQL 8.0 оставляет эти идентификаторы неиспользованными.
Рик Джеймс

12
ALTER TABLE news_feed DROP id

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

Я использовал это в некоторых своих сценариях, поле id отбрасывалось и затем добавлялось обратно с предыдущими настройками, все существующие поля в таблице базы данных заполняются новыми значениями автоматического приращения, это также должно работать с InnoDB.

Обратите внимание, что все поля в таблице будут пересчитаны и будут иметь другие идентификаторы !!!.


3
Я хотел бы иметь что-то вроде этого! Но как дополнительное предупреждение; это, очевидно, полностью сломает ваши внешние ключи.
NoobishPro

12

Вы также можете использовать синтаксическую TRUNCATEтаблицу следующим образом: TRUNCATE TABLE table_name

BEWARE !! TRUNCATE TABLE your_tableбудет удалять все в вашем your_table!!


14
Новые программисты , знайте, что TRUNCATEтакже удалит ВСЕ ваши строки в указанной таблице!
Zanshin13

1
Приведенный выше комментарий должен быть вставлен в ответ или, по крайней мере, объяснение фактического использования усечения.
Лукас Кауз

TRUNCATEсбросит auto_incrementполя тоже? Мой вариант использования - очистить старые данные в таблице и снова начать идентификаторы с 1 для новых данных (представьте, очистка таблицы для правильного использования после завершения тестирования). Я думал, что мне придется DROPвесь стол и CREATEснова.
ADTC

Да, TRUNCATE работает как сброс на столе. Это не совсем верно, если таблица была изменена с момента ее создания, тогда эти изменения не будут сброшены. Я предполагаю, что это ближе к экспорту структуры таблицы и использованию экспорта для создания новой таблицы, а не фактического сброса.
Крис

Да, @ ADTC. Если вы хотите сохранить текущее auto_incrementзначение, используйте DELETE FROMвместо TRUNCATE.
TRiG

8

это для пустой таблицы:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

если у вас есть данные, но вы хотите привести их в порядок, я рекомендую использовать это:

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

просто использовать это
Абдул Азиз Аль Басыр

Это сработало для нас с данными. Сброс строки до следующего индекса. Спасибо!
Ослепление


5

Вот мое решение, но я не буду советовать делать это, если ваш столбец имеет ограничения или связан как внешний ключ с другими таблицами, так как это может иметь плохие последствия или даже не будет работать.

> Во-первых: бросьте колонку

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

Это хорошо работает!


3

Начиная с MySQL 5.6, подход, описанный ниже, работает быстрее благодаря интерактивному DDL (примечание algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;


2

Вы можете просто обрезать таблицу, чтобы сбросить последовательность

TRUNCATE TABLE TABLE_NAME

1

Я попытался изменить таблицу и установить auto_increment в 1, но это не сработало. Я решил удалить имя столбца, который я увеличивал, затем создать новый столбец с вашим предпочтительным именем и установить этот новый столбец с приращением.


не могли бы вы объяснить, как вы это сделали?
М.Зарагоса

@MZaragoza Просто удалите старый столбец без ИИ, а затем создайте новый, в котором включен ИИ.
Андромеда

Можете ли вы обновить свой ответ, чтобы показать это. Я был бы очень признателен
MZaragoza

1

Счетчик автоматического приращения для таблицы может быть (пере) установлен двумя способами:

  1. Выполняя запрос, как уже объяснили другие:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. Использование Workbench или другого визуального инструмента проектирования баз данных. Я покажу в Workbench, как это делается, но в другом инструменте он не должен сильно отличаться. Правым кликом по нужной таблице и выбора Alter tableиз контекстного меню. Внизу вы можете увидеть все доступные варианты изменения таблицы. Выберите Optionsи вы получите эту форму: введите описание изображения здесь

    Затем просто установите желаемое значение в поле, Auto incrementкак показано на рисунке. Это в основном выполнит запрос, показанный в первом варианте.


0

Чтобы обновить последний плюс один идентификатор

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


0

Я гуглил и нашел этот вопрос, но ответ, который я действительно ищу, удовлетворяет двум критериям:

  1. используя чисто запросы MySQL
  2. сбросить существующее табличное автоинкремент до max (id) + 1

Поскольку я не мог найти именно то, что я хочу здесь, я выложил ответ из различных ответов и поделился им здесь.

Несколько вещей, чтобы отметить:

  1. рассматриваемая таблица InnoDB
  2. таблица использует поле idс типом в intкачестве первичного ключа
  3. единственный способ сделать это чисто в MySQL - это использовать хранимую процедуру
  4. мои изображения ниже используют SequelPro в качестве графического интерфейса. Вы должны иметь возможность адаптировать его на основе предпочитаемого вами редактора MySQL
  5. Я проверил это на MySQL Ver 14.14 Distrib 5.5.61, для Debian-Linux-GNU

Шаг 1. Создание хранимой процедуры

создайте хранимую процедуру следующим образом:

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 ;

Тогда запустите это.

Перед запуском это выглядит так, когда вы смотрите в разделе «Хранимые процедуры» в своей базе данных.

введите описание изображения здесь

Когда я запускаю, я просто выбираю хранимую процедуру и нажимаю Run Selection.

введите описание изображения здесь

Примечание: разделители имеют решающее значение. Следовательно, если вы копируете и вставляете сверху выбранные ответы в этом вопросе, они, как правило, не работают по этой причине.

После запуска я должен увидеть хранимую процедуру

введите описание изображения здесь

Если вам нужно изменить хранимую процедуру, вам нужно удалить хранимую процедуру, а затем выбрать ее снова запустить.

Шаг 2: вызов хранимой процедуры

На этот раз вы можете просто использовать обычные запросы MySQL.

call reset_autoincrement('products');

Первоначально из моих собственных заметок SQL-запросов в https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc и адаптирован для StackOverflow



-1

Попробуйте запустить этот запрос

 ALTER TABLE tablename AUTO_INCREMENT = value;

Или попробуйте этот запрос для автоматического сброса

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

И установить автоинкремент, затем выполнить этот запрос

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

-2

Я предлагаю вам перейти в Query Browser и сделать следующее:

  1. Перейдите к схемам и найдите таблицу, которую вы хотите изменить.
  2. Щелкните правой кнопкой мыши и выберите Скопировать создать заявление.
  3. Откройте вкладку результатов и вставьте оператор создания их.
  4. Перейдите к последней строке оператора create и найдите значение Auto_Increment = N, (где N - текущее число для поля auto_increment.)
  5. Заменить N на 1.
  6. Нажмите ctrl+enter .

Auto_increment должен сброситься на единицу после ввода новой строки в таблицу.

Я не знаю, что произойдет, если вы попытаетесь добавить строку, в которой значение поля auto_increment уже существует.

Надеюсь, это поможет!


-2

Лучший способ - удалить поле с ИИ и добавить его снова с ИИ, работает для всех таблиц


1
не самый лучший способ, падение столбца приведет к потере данных столбца
Disha Goyal
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.