Как я могу сбросить AUTO_INCREMENT
поля?
Я хочу, чтобы он снова начал отсчет с 1
.
24 ответа
Вы можете сбросить счетчик с помощью:
ALTER TABLE tablename AUTO_INCREMENT = 1
Для InnoDB вы не можете установить значение auto_increment
ниже или равным наивысшему текущему индексу. (цитата из ViralPatel):
Обратите внимание, что вы не можете сбросить счетчик до значения, меньшего или равного уже использованному. Для MyISAM, если значение меньше или равно максимальному значению в данный момент в столбце AUTO_INCREMENT, значение сбрасывается до текущего максимума плюс один. Для InnoDB, если значение меньше текущего максимального значения в столбце, ошибки не возникает и текущее значение последовательности не изменяется.
См. Как сбросить автоинкремент MySQL с использованием значения MAX из другой таблицы? о том, как динамически получить приемлемую стоимость.
Я предлагаю вам перейти в браузер запросов и сделать следующее:
Перейдите к схемам и найдите таблицу, которую хотите изменить.
Щелкните правой кнопкой мыши и выберите скопировать оператор создания.
Откройте вкладку результатов и вставьте оператор создания их.
Перейдите к последней строке оператора create и найдите Auto_Increment = N, (Где N - текущий номер для поля auto_increment.)
Замените N на 1.
Нажмите ctrl+enter .
Auto_increment должен сбрасываться на единицу после ввода новой строки в таблице.
Я не знаю, что произойдет, если вы попытаетесь добавить строку, в которой уже существует значение поля auto_increment.
Вам нужно следовать совету из комментария Майлза М., и вот небольшой код, который исправляет диапазон в mysql. Также вам нужно открыть my.ini (Mysql) и изменить max_execution_time = 60 на max_execution_time = 6000; для больших баз данных. Не используйте "ALTER TABLE tablename AUTO_INCREMENT = 1", он удалит все в вашей базе данных.
$con=mysqli_connect($dbhost, $dbuser, $dbpass, $database);
$res=mysqli_query($con, "select * FROM data WHERE id LIKE id ORDER BY id ASC");
$count = 0;
while ($row = mysqli_fetch_array($res)){
$count++;
mysqli_query($con, "UPDATE data SET id='".$count."' WHERE id='".$row['id']."'");
}
echo 'Done reseting id';
mysqli_close($con);
Лучший способ - удалить поле с помощью AI и снова добавить его с помощью AI, работает для всех таблиц.
Попробуйте выполнить этот запрос
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;
Я погуглил и нашел этот вопрос, но ответ, который я действительно ищу, соответствует двум критериям:
- используя чисто MySQL-запросы
- сбросить автоинкремент существующей таблицы на max (id) + 1
Поскольку я не смог найти здесь именно то, что хочу, я собрал ответ из разных ответов и поделился им здесь.
Несколько замечаний:
- рассматриваемая таблица - InnoDB
- таблица использует поле
id
с типом какint
в качестве первичного ключа - единственный способ сделать это чисто в MySQL - использовать хранимую процедуру
- мои изображения ниже используют SequelPro в качестве графического интерфейса. Вы должны иметь возможность адаптировать его на основе предпочитаемого вами редактора MySQL.
- Я тестировал это на 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-query / # mysql-reset-autoinc и адаптирован для StackOverflow.
ALTER TABLE имя таблицы AUTO_INCREMENT = 1
Чтобы обновить последний плюс один идентификатор
ALTER TABLE table_name AUTO_INCREMENT =
(SELECT (id+1) id FROM table_name order by id desc limit 1);
Вы можете просто обрезать таблицу, чтобы сбросить последовательность
TRUNCATE TABLE TABLE_NAME
Я попытался изменить таблицу и установить auto_increment на 1, но это не сработало. Я решил удалить имя столбца, которое я увеличивал, затем создать новый столбец с вашим предпочтительным именем и настроить этот новый столбец на увеличение с самого начала.
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
Счетчик автоматического приращения для таблицы может быть (пере) установлен двумя способами:
Выполняя запрос, как уже объяснялись другие:
ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;
Использование Workbench или другого инструмента визуального проектирования баз данных. Я собираюсь показать в Workbench, как это делается, но и в других инструментах это не должно сильно отличаться. Щелкните правой кнопкой мыши нужную таблицу и выберите
Alter table
в контекстном меню. Внизу вы можете увидеть все доступные варианты изменения таблицы. ВыберитеOptions
, и вы получите такую форму:Затем просто установите желаемое значение в поле
Auto increment
, как показано на рисунке. Это в основном выполнит запрос, показанный в первом варианте.
Вот мое решение, но я не буду советовать это делать, если ваш столбец имеет ограничения или подключен как внешний ключ к другим таблицам, так как это будет иметь плохие последствия или даже не будет работать.
> Во-первых: отбросьте столбец
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
Это хорошо работает!
Начиная с MySQL 5.6, приведенный ниже подход работает быстрее из-за онлайн DDL (примечание algorithm=inplace
):
alter table tablename auto_increment=1, algorithm=inplace;
Это для пустой таблицы:
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`);
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.
Обратите внимание, что все поля в таблице будут пересчитаны и будут иметь другие идентификаторы !!!.
Вы также можете использовать синтаксическую таблицу TRUNCATE
следующим образом: TRUNCATE TABLE table_name
ОСТОРОЖНО !! TRUNCATE TABLE your_table
удалит все в вашем your_table
!!
Есть хорошие варианты, указанные в Как сбросить столбец автоинкремента MySQL
Обратите внимание, что ALTER TABLE tablename AUTO_INCREMENT = value;
не работает для InnoDB
Добавление обновления, поскольку функциональность изменилась в 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
Мое тестирование также показывает, что таблица НЕ копируется, просто значение меняется.
Все ответы на этот вопрос с наивысшими оценками рекомендуют "ALTER yourtable AUTO_INCREMENT = value". Однако это работает только тогда, когда value
в alter больше, чем текущее максимальное значение столбца автоинкремента. Согласно документации MySQL 8:
Вы не можете сбросить счетчик до значения, меньшего или равного текущему значению. Как для InnoDB, так и для MyISAM, если значение меньше или равно максимальному значению в данный момент в столбце AUTO_INCREMENT, значение сбрасывается до текущего максимального значения столбца AUTO_INCREMENT плюс один.
По сути, вы можете изменить AUTO_INCREMENT только для увеличения значения столбца автоинкремента, а не сбросить его до 1, как задает OP во второй части вопроса. Для параметров, которые фактически позволяют вам установить AUTO_INCREMENT вниз от его текущего максимума, взгляните на Изменить порядок / сбросить первичный ключ с автоматическим приращением.
Лучшее решение, которое сработало для меня:
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, и мне не нужно знать текущее максимальное значение! Таким образом, счетчик автоматического приращения будет сброшен, и он будет автоматически запускаться с максимального существующего значения.
Существует очень простой способ с помощью phpmyadmin на вкладке "операции", вы можете установить, в параметрах таблицы автоинкремент до нужного числа.
Просто так:
ALTER TABLE tablename AUTO_INCREMENT = value;
Ссылка: http://dev.mysql.com/doc/refman/5.1/en/ alter-table.html
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
Я думаю, это сработает
Похожие вопросы
Новые вопросы
mysql
MySQL - это бесплатная система управления реляционными базами данных с открытым исходным кодом (RDBMS), использующая язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. Д. Это разные БД, которые все используют свои собственные диалекты SQL для управления данными.