MySQL Видалити всі рядки з таблиці та скинути ідентифікатор до нуля


183

Мені потрібно видалити всі рядки з таблиці, але коли я додаю новий рядок, я хочу, щоб ідентифікатор первинного ключа, який має автоматичний приріст, починався знову з 0 відповідно з 1.

Відповіді:


304

Не видаляйте, використовуйте усікання:

Truncate table XXX

Обробник таблиці не запам'ятовує останнє використане значення AUTO_INCREMENT, але починає рахувати з початку. Це справедливо навіть для MyISAM та InnoDB, які зазвичай не використовують значення послідовностей.

Джерело .


20
Truncate добре працює з не обмеженими таблицями, але якщо у вашій таблиці обмеження зовнішнього ключа, ви можете скористатися методом Видалити. Дивіться цю публікацію, якщо у вас є обмеження у ФК: урізати таблицю обмежених зовнішнім ключем
Джуліан Соро

1
пам'ятайте, що таблиця скорочення не збирається відкидати
пенні чан

83

Якщо ви не можете скористатися TRUNCATE(наприклад, через обмеження сторонніх ключів), ви можете використовувати таблицю змін після видалення всіх рядків, щоб перезапустити auto_increment:

ALTER TABLE mytable AUTO_INCREMENT = 1

3
@NBhargav Оскільки ви, можливо, використовуєте двигун InnoDB на своєму столі замість MyISAM, перший не підтримує скидання індексу.
Густаво Рубіо

як видалити всі рядки перед зміною значення
auto_increment

@KasunSiyambalapitiya DELETE FROM tablename;(але це не спрацює добре, якщо є обмеження у ФК - див. Stackoverflow.com/a/5452798/507761 )
Матвій

17

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

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 ;

Але різниця буде у часі виконання. Подивіться вище на відповідь Соріна.


2
Це хороший спосіб отримати дані осиротіння в будь-якій таблиці, що є сторонніми ключами до таблиці, яку ви витираєте. Увімкнення перевірки зовнішнього ключа після факту не призводить до того, що MySQL повторно підтверджує ці іноземні ключі, наскільки мені відомо. Це залишає вам рядки, які містять дані, які не існують у довідковій таблиці. Можливо, ви навіть взагалі не маєте сторонніх ключів на своєму столі.
Кімманон

8

Цікавий факт.

Я був впевнений , що TRUNCATEзавжди буде працювати краще, але в моєму випадку, для бази даних з приблизно 30 таблиць з зовнішніми ключами, заселених тільки кілька рядків, вона займає близько 12 секунд , щоб TRUNCATEвсі таблиці, на відміну від усього лише декількох сот мілісекунд до DELETEряди. Встановлення автоматичного збільшення збільшує приблизно секунду, але це все-таки набагато краще.

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


2

якщо ви хочете скористатися, truncateскористайтеся цим:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.