Мені потрібно видалити всі рядки з таблиці, але коли я додаю новий рядок, я хочу, щоб ідентифікатор первинного ключа, який має автоматичний приріст, починався знову з 0 відповідно з 1.
Мені потрібно видалити всі рядки з таблиці, але коли я додаю новий рядок, я хочу, щоб ідентифікатор первинного ключа, який має автоматичний приріст, починався знову з 0 відповідно з 1.
Відповіді:
Не видаляйте, використовуйте усікання:
Truncate table XXX
Обробник таблиці не запам'ятовує останнє використане значення AUTO_INCREMENT, але починає рахувати з початку. Це справедливо навіть для MyISAM та InnoDB, які зазвичай не використовують значення послідовностей.
Джерело .
Якщо ви не можете скористатися TRUNCATE(наприклад, через обмеження сторонніх ключів), ви можете використовувати таблицю змін після видалення всіх рядків, щоб перезапустити auto_increment:
ALTER TABLE mytable AUTO_INCREMENT = 1
DELETE FROM tablename;(але це не спрацює добре, якщо є обмеження у ФК - див. 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 таблиць з зовнішніми ключами, заселених тільки кілька рядків, вона займає близько 12 секунд , щоб TRUNCATEвсі таблиці, на відміну від усього лише декількох сот мілісекунд до DELETEряди. Встановлення автоматичного збільшення збільшує приблизно секунду, але це все-таки набагато краще.
Тож я б запропонував спробувати і те й інше, і подивіться, що працює швидше для вашого випадку.