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.
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:
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 .
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
DELETE FROM tablename;(ancak FK kısıtlamaları olduğunda bu işe yaramayacaktır - bkz. Stackoverflow.com/a/5452798/507761 )
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.
İ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.