MySQL Tablodaki tüm satırları silin ve kimliği sıfırlayın


183

Tablodaki tüm satırları silmem gerekiyor, ancak yeni bir satır eklediğimde, otomatik bir artışa sahip birincil anahtar kimliğinin sırasıyla 0'dan 1'den yeniden başlamasını istiyorum.

Yanıtlar:


304

Silmeyin, kesmeyi kullanın:

Truncate table XXX

Tablo işleyicisi en son kullanılan AUTO_INCREMENT değerini hatırlamaz, ancak baştan saymaya başlar. Bu, normalde dizi değerlerini yeniden kullanmayan MyISAM ve InnoDB için bile geçerlidir.

Kaynak .


20
Kısaltma, kısıtlanmamış tablolarla iyi çalışır, ancak tablonuzda Yabancı Anahtar kısıtlaması varsa, Sil yöntemini kullanmayı düşünebilirsiniz. FK kısıtlamalarınız varsa bu gönderiye bakın: yabancı anahtar kısıtlamalı tabloyu
Julian Soro

1
truncate tablosunun geri dönmeyeceğini unutmayın
penny chan

83

Otomatik_increment'ı TRUNCATEyeniden başlatmak için tüm satırları sildikten sonra bir değiştirme tablosu kullanabilirsiniz (örneğin, yabancı anahtar kısıtlamaları nedeniyle):

ALTER TABLE mytable AUTO_INCREMENT = 1

3
@NBhargav Masanızda MyISAM yerine InnoDB motoru kullanıyor olabileceğinizden, ilk önce dizinin sıfırlanmasını desteklemiyoruz.
Gustavo Rubio

auto_increment değerini değiştirmeden önce tüm satırları silme
Kasun Siyambalapitiya

@KasunSiyambalapitiya DELETE FROM tablename;(ancak FK kısıtlamaları olduğunda bu işe yaramayacaktır - bkz. Stackoverflow.com/a/5452798/507761 )
Matthew

17

Tablonun yabancı anahtarları varsa, ben her zaman aşağıdaki kodu kullanın:

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 ;

Fakat fark uygulama zamanında olacaktır. Sorin'in cevabının yukarısına bakın.


2
Bu, sildiğiniz tablonun yabancı anahtarlarının bulunduğu herhangi bir tabloda yetim verilere sahip olmanın iyi bir yoludur. Gerçeklemeden sonra yabancı anahtar denetimlerinin etkinleştirilmesi, MySQL'in bu yabancı anahtarları bildiğim kadarıyla yeniden doğrulamasına neden olmaz. Bu , başvuru tablosunda bulunmayan veriler içeren satırlar bırakır . Sen de bile olmayabilir sahip tüm adresinden masada yabancı anahtarları.
cimmanon

8

İlginç bir gerçek.

emindim TRUNCATE zaman daha iyi performans göstereceğinden , ancak benim durumumda, sadece birkaç satır ile doldurulmuş yaklaşık 30 tablo yabancı anahtarlı bir veritabanı için TRUNCATE, sadece birkaç yüz milisaniyenin aksine, tüm tablolara yaklaşık 12 saniye sürdü DELETE. satırlar. Otomatik artışın ayarlanması toplamda yaklaşık bir saniye ekler, ancak yine de çok daha iyidir.

Bu yüzden ikisini de denemenizi öneririm.


2

kullanmak istiyorsanız bunu kullanın truncate:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.