Мне нужно удалить все строки из таблицы, но когда я добавляю новую строку, я хочу, чтобы идентификатор первичного ключа с автоматическим приращением начинался с 0 соответственно с 1.
Мне нужно удалить все строки из таблицы, но когда я добавляю новую строку, я хочу, чтобы идентификатор первичного ключа с автоматическим приращением начинался с 0 соответственно с 1.
Ответы:
Не удаляйте, используйте усечение:
Truncate table XXX
Обработчик таблицы не запоминает последнее использованное значение AUTO_INCREMENT, но начинает отсчет с начала. Это верно даже для MyISAM и InnoDB, которые обычно не используют значения последовательности.
Источник .
Если вы не можете использовать TRUNCATE
(например, из-за ограничений внешнего ключа), вы можете использовать таблицу изменения после удаления всех строк, чтобы перезапустить auto_increment:
ALTER TABLE mytable AUTO_INCREMENT = 1
DELETE FROM tablename;
(но это не будет работать хорошо, когда есть ограничения FK - см. Stackoverflow.com/a/5452798/507761 )
Если таблица имеет внешние ключи, тогда я всегда использую следующий код:
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 ;
Но разница будет во времени исполнения. Посмотрите на ответ Сорина выше.
Интересный факт.
Я был уверен, TRUNCATE
что всегда будет работать лучше, но в моем случае для базы данных с приблизительно 30 таблицами с внешними ключами, заполненной всего несколькими строками, для TRUNCATE
всех таблиц потребовалось около 12 секунд , а не несколько сотен миллисекунд дляDELETE
строк. Установка автоматического приращения добавляет около секунды, но все равно намного лучше.
Так что я бы посоветовал попробовать оба, посмотреть, что работает быстрее для вашего случая.