Мне нужно удалить все строки из таблицы, но когда я добавляю новую строку, я хочу, чтобы идентификатор первичного ключа, у которого есть автоматическое приращение, начинался с 0 соответственно с 1.
MySQL Удалите все строки из таблицы и reset ID до нуля
Ответ 1
Не удалять, используйте truncate:
Truncate table XXX
Обработчик таблицы не запоминает последнее использованное значение AUTO_INCREMENT, но начинает отсчет с самого начала. Это справедливо даже для MyISAM и InnoDB, которые обычно не повторяют значения последовательностей.
Ответ 2
Если вы не можете использовать TRUNCATE
(например, из-за ограничений внешнего ключа), вы можете использовать таблицу alter после удаления всех строк, чтобы перезапустить auto_increment:
ALTER TABLE mytable AUTO_INCREMENT = 1
Ответ 3
Если таблица имеет внешние ключи, я всегда использую следующий код:
SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check
SET AUTOCOMMIT = 0; -- disable autocommit
START TRANSACTION; -- begin transaction
/*
DELETE FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- or
TRUNCATE table_name;
-- or
DROP TABLE table_name;
CREATE TABLE table_name ( ... );
*/
SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check
COMMIT; -- make a commit
SET AUTOCOMMIT = 1 ;
Но разница будет во время выполнения. Посмотрите на ответ Сорина.
Ответ 4
Интересный факт.
Я был уверен, что TRUNCATE
всегда будет работать лучше, но в моем случае для базы данных с примерно 30 таблицами с внешними ключами, заполненными всего несколькими строками, потребовалось около 12 секунд для TRUNCATE
всех таблиц, так как против всего нескольких сотен миллисекунд до DELETE
строк.
Установка автоматического приращения добавляет около секунды, но все же намного лучше.
Поэтому я бы предложил попробовать оба, посмотреть, что работает быстрее для вашего дела.