Як скинути AUTO_INCREMENT в MySQL?


1245

Як я можу скинутиAUTO_INCREMENT поле?
Я хочу, щоб він почав рахувати 1знову.


9
Ви можете отримати кращу відповідь на сайті для DBA на сайті dba.stackexchange.com
Rowland Shaw

80
Ви, ймовірно, захочете і випорожнити стіл:TRUNCATE TABLE yourTableName;
Конерак


3
так, найкраща в цьому випадку таблиця урізання. він також скидає початок автоматичного збільшення до 1.
raidsan

2
Іноді ви не маєте дозволу на TRUNCATE, оскільки для цього потрібні дозволи DROP.
Люк Двоюрідний

Відповіді:


2024

Ви можете скинути лічильник за допомогою:

ALTER TABLE tablename AUTO_INCREMENT = 1

Для InnoDB ви не можете встановити auto_incrementзначення, яке є нижчим або рівним найвищому поточному індексу. (цитата від ViralPatel ):

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

Див. Як скинути MySQL AutoIncrement за допомогою значення 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, значення скидається до поточного максимуму плюс один. Для InnoDB, якщо значення менше, ніж поточне максимальне значення в стовпці, помилки не виникає і поточне значення послідовності не змінюється. " Звучить, що тут нічого не відбудеться, якщо саморіст збільшиться за 1.
lreeder

159
ALTER TABLE tablename AUTO_INCREMENT = 1

7
Чи можу я знати, яка різниця між вашою відповіддю та попередньою відповіддю
Правен Шрінівасан

30
@PraveenSrinivasan немає різниці, ми додали їх одночасно
boobiq

79
Особисто я вважаю, що прекрасно, що ці два відповіді на питання AUTO_INCREMENT мали зіткнення одночасно :-)
Марк Голдфайн

@MarkGoldfain так!
ncomputers

одночасність спричинить стан гонки mysql ...
Сямсул Азрієн

81
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

Я думаю, що це вдасться зробити


2
На це питання вже є відповідна відповідь. Далі ви UPDATEоновите всі значення в idстовпці.
Керміт

2
ОП не зазначає, що вони переупорядковують наявні рядки.
Керміт

Повна і досконала відповідь. Але я маю сумніви, що коли ми вставляємо нове значення, то, що буде PK цього значення. Це 1 чи наступний ПК?
Prifulnath

так, це найкраще рішення, але ви, можливо, захочете заблокувати таблиці, якщо будуть
записані

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


40

введіть тут опис зображенняНа вкладці «операції» з phpmyadmin є дуже простий спосіб, ви можете встановити в таблиці параметри автоматичне збільшення потрібного номера.


Вам потрібно перезапустити сервіс / сервер mysql відразу після цього.
Кібер

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 значення автоматичного включення на information_schema; перевіркаSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun

1
Я перевірив версію 5.6.x, і це спрацювало чудово, і запит Kerem Güneş повернув максимальне значення плюс один, НЕ нульовий, як зазначено. (можливо, вона встановлена ​​на нуль після першого запиту, але це не після другого запиту) Я вважаю, що це найкраще рішення для InnoDB.
Френк Форте

Те саме, що встановлено явне значення: "створіть нову таблицю з тією ж структурою та новим значенням auto_increment та скопіюйте всі записи з оригінальної таблиці, скиньте оригінал та перейменуйте нову. Це може мати значний вплив на продуктивність (та на диску на диску) на виробничих середовищах, якщо таблиця велика ". але набагато гірше, тому що потрібна повна таблиця копіювання два рази.
Енібі

Я підтверджую , що це працює для версії 5.6.15, в той час як ALTER TABLE tablename AUTO_INCREMENT = 1робить НЕ .
Ней

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 з InnoDB:

ALTER TABLE tablename AUTO_INCREMENT = 1;

Документи оновлюються, щоб відобразити це:

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

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


19

У розділі Як скинути стовпчик автоматичного підвищення MySQL є хороші варіанти

Зауважте, що ALTER TABLE tablename AUTO_INCREMENT = value;це не працює для InnoDB


8
Як вам це зробити з InnoDB?
EmptyArsenal

4
Для мене добре працює за допомогою MySQL v 5.6.2
Едді Б

У мене була подібна проблема, коли поле для автоматичного збільшення не було скинуто після видалення записів із таблиці. 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

ПОВЕРНУТИСЯ !! TRUNCATE TABLE your_tableбуде видаляти всі у вашому your_table!!


14
Нові програмісти , пам’ятайте, що TRUNCATEтакож видалять ВСІ ваші рядки у вказаній таблиці!
Заншин13,

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;



1

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


Ви могли б пояснити, як ви зробили це?
MZaragoza

@MZaragoza Просто опустіть старий стовпець, у якому немає AI, а потім створіть новий, у якому активований AI.
andromeda

Чи можете ви оновити свою відповідь, щоб це показати. Я дуже би вдячний
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 ;

Потім запустіть його.

Перед запуском це виглядає приблизно так, коли ви дивитесь у розділі Збережені процедури у вашій базі даних.

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

Коли я запускаю, я просто вибираю збережену процедуру і натискаю Запуск вибору

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

Примітка: Розмежувальна частина має вирішальне значення. Отже, якщо ви скопіюєте та вставте відповіді, обрані зверху в цьому питанні, вони, як правило, не працюють з цієї причини.

Після запуску я повинен побачити збережену процедуру

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

Якщо вам потрібно змінити збережену процедуру, потрібно видалити збережену процедуру, а потім вибрати для запуску ще раз.

Крок 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

Я пропоную вам перейти до браузера запитів і зробити наступне:

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

Auto_increment має бути скинутий до одного, коли ви введете новий рядок у таблицю.

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

Сподіваюся, що це допоможе!


-2

Найкращий спосіб - видалити поле з AI і додати його знову за допомогою AI, працює для всіх таблиць


1
не найкращий спосіб взагалі, якщо
Діша
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.