MySQL Hapus semua baris dari tabel dan setel ulang ID ke nol

183

Saya perlu menghapus semua baris dari sebuah tabel tetapi ketika saya menambahkan baris baru, saya ingin ID kunci utama, yang memiliki kenaikan otomatis, untuk mulai lagi dari 0 masing-masing dari 1.

marek_lani
sumber

Jawaban:

304

Jangan hapus, gunakan terpotong:

Truncate table XXX

Penangan tabel tidak mengingat nilai AUTO_INCREMENT yang terakhir digunakan, tetapi mulai menghitung dari awal. Ini berlaku bahkan untuk MyISAM dan InnoDB, yang biasanya tidak menggunakan kembali nilai urutan.

Sumber .

Francois
sumber
20
Truncate berfungsi dengan baik dengan tabel yang tidak dibatasi, tetapi jika tabel Anda memiliki batasan Kunci Asing, Anda dapat mempertimbangkan menggunakan metode Hapus. Lihat posting ini jika Anda memiliki batasan FK: truncate foreign key constrained table
Julian Soro
1
jangan lupa bahwa meja truncate tidak akan mundur
sen sen
83

Jika Anda tidak dapat menggunakan TRUNCATE(misalnya karena batasan kunci asing) Anda dapat menggunakan tabel alter setelah menghapus semua baris untuk memulai kembali auto_increment:

ALTER TABLE mytable AUTO_INCREMENT = 1
seekor kuda tanpa nama
sumber
3
@NBhargav Karena Anda mungkin menggunakan mesin InnoDB di meja Anda alih-alih MyISAM, yang pertama tidak mendukung pengaturan ulang indeks.
Gustavo Rubio
cara menghapus semua baris sebelum mengubah nilai auto_increment
Kasun Siyambalapitiya
@KasunSiyambalapitiya DELETE FROM tablename;(tapi itu tidak akan berfungsi dengan baik ketika ada kendala FK - lihat stackoverflow.com/a/5452798/507761 )
Matthew Read
17

Jika tabel memiliki kunci asing maka saya selalu menggunakan kode berikut:

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 ;

Tetapi perbedaannya ada pada waktu eksekusi. Lihatlah jawaban Sorin di atas.

hitam
sumber
2
Ini adalah cara yang baik untuk memiliki data yatim di setiap tabel yang kunci asing ke tabel yang Anda hapus. Mengaktifkan pemeriksaan kunci asing setelah faktanya tidak menyebabkan MySQL memvalidasi ulang kunci-kunci asing sejauh yang saya ketahui. Ini memberi Anda baris yang berisi data yang tidak ada di tabel referensi. Anda mungkin bahkan tidak memiliki kunci asing di meja Anda sama sekali.
cimmanon
8

Fakta yang menarik.

Saya yakin TRUNCATEakan selalu berkinerja lebih baik, tetapi dalam kasus saya, untuk database dengan sekitar 30 tabel dengan kunci asing, diisi dengan hanya beberapa baris, butuh sekitar 12 detik untuk TRUNCATEsemua tabel, dibandingkan dengan hanya beberapa ratus milidetik untukDELETE yang baris. Mengatur penambahan otomatis menambahkan sekitar satu detik secara total, tetapi masih jauh lebih baik.

Jadi saya sarankan coba keduanya, lihat mana yang bekerja lebih cepat untuk kasus Anda.

Sorin
sumber
2

jika Anda ingin menggunakan truncategunakan ini:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
david2020
sumber