MySQL'de AUTO_INCREMENT nasıl sıfırlanır?


1246

Nasıl olabilir sıfırlamakAUTO_INCREMENT bir alanın? Tekrar
saymaya başlamasını istiyorum 1.


9
DBA'lar için sitede daha iyi yanıt alabilirsiniz dba.stackexchange.com
Rowland Shaw

80
Muhtemelen tabloyu da boşaltmak isteyeceksiniz:TRUNCATE TABLE yourTableName;
Konerak

3
olası MySQL
outis

3
evet, bu durumda kesme tablosu en iyisidir. ayrıca otomatik artış başlangıcını 1'e sıfırlar.
raidsan

2
Bazen DROP izinleri gerektirdiği için TRUNCATE izniniz olmayabilir.
Luke Cousins

Yanıtlar:


2024

Sayacı aşağıdakilerle sıfırlayabilirsiniz:

ALTER TABLE tablename AUTO_INCREMENT = 1

InnoDB için, auto_incrementdeğeri en yüksek akım dizinine daha düşük veya eşit olarak ayarlayamazsınız . ( ViralPatel'den alıntı ):

Sayacı, daha önce kullanılmış olandan küçük veya ona eşit bir değere sıfırlayamayacağınızı unutmayın. MyISAM için, değer şu anda AUTO_INCREMENT sütunundaki maksimum değerden küçük veya ona eşitse, değer geçerli maksimum artı bir değerine sıfırlanır. InnoDB için, değer sütundaki geçerli maksimum değerden küçükse hiçbir hata oluşmaz ve geçerli sıra değeri değiştirilmez.

Bkz . Başka bir tablodaki MAX değerini kullanarak bir MySQL OtomatikIncrement Nasıl Sıfırlanır? dinamik olarak kabul edilebilir bir değer elde etme konusunda.


8
Bu doldurulmuş bir tablo için sonsuza kadar sürebilir. Buna dikkat edin: stackoverflow.com/questions/2681869/…
BT

52
this is acircular reference
Besnik

5
Ne demek istiyorsun curcular reference?
Niels

73
MySql'in aynı yapıya ve yeni auto_increment değerine sahip yeni bir tablo oluşturacağını ve orijinal tablodaki tüm kayıtları kopyalayacağını, orijinali bırakacağını ve yeni tabloyu yeniden adlandıracağını unutmayın. Tablonun büyük olması, bunun üretim ortamları üzerinde önemli bir performans etkisine (ve disk alanına) neden olabilir.
Rostol

6
Zaten OTOINCREMENT sütununuz varsa, bu çok oylanan cevap gerçekten işe yarıyor mu? MySQL 5.1 belgelerine göre: "Sayacı daha önce kullanılmış olan değere eşit veya daha küçük bir değere sıfırlayamazsınız. MyISAM için, değer şu anda AUTO_INCREMENT sütunundaki maksimum değerden küçük veya ona eşitse, değeri geçerli maksimum artı bir değerine sıfırlanır. InnoDB için, değer sütundaki geçerli maksimum değerden küçükse hiçbir hata oluşmaz ve geçerli dizi değeri değiştirilmez. "
Autoincrement

159
ALTER TABLE tablename AUTO_INCREMENT = 1

7
Cevabınız ile bir önceki cevap arasındaki farkın ne olduğunu öğrenebilir miyim
Praveen Srinivasan

30
@PraveenSrinivasan fark yok, onları aynı anda ekledik
boobiq

79
Şahsen, ben bir AUTO_INCREMENT soru için bu iki cevap bir eşzamanlılık çarpışma vardı güzel bir şey olduğunu düşünüyorum :-)
Mark Goldfain

@MarkGoldfain evet öyle!
ncomputers

eşzamanlılık mysql yarış durumuna neden olacak ...
Syamsoul Azrien

81
SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;

Bence bu yapacak


2
Bu sorunun zaten uygun bir cevabı var. Ayrıca, sütundaki UPDATEtüm değerleri güncelleyeceksiniz id.
Kermit

2
OP, mevcut satırları yeniden sipariş ettiklerini belirtmez.
Kermit

Tam ve mükemmel cevap. Ama yeni bir değer eklerken bu değerin PK'sının ne olacağından şüphe duyuyorum. İster 1, ister bir sonraki PK olsun?
Prifulnath

evet bu en iyi çözüm, ancak eğer veriler
yazılıyorsa

çok yararlı, ben 1 ile başlamak için otomatik artış sıfırlamak zorunda aynı requirment vardı, sadece ilk iki komut yardımcı oldu.
LOKENDRA


40

resim açıklamasını buraya girinPhpmyadmin ile "işlemleri" sekmesi altında çok kolay bir yol var, tablo seçeneklerinde, istediğiniz sayıya otomatik artış ayarlayabilirsiniz.


Bundan sonra mysql hizmetini / sunucusunu yeniden başlatmanız gerekir.
Siber

1
Bundan sonra sunucunuzu yeniden başlatmanız gerektiğini düşünmüyorum. PhpAdmin sadece artış başlangıç ​​noktasını değiştirmek için komutu çalıştıracaktır.
Kareem

Yeniden başlatmanıza gerek yoktur, bir sonraki eklemeden geçerlilik kazanır.
IlludiumPu36

36

Benim için çalışan en iyi çözüm:

ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED;
COMMIT;
ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED AUTO_INCREMENT;
COMMIT;

Hızlı, innoDB ile çalışır ve mevcut maksimum değeri bilmeme gerek yok! Bu şekilde otomatik artış sayacı sıfırlanacak ve mevcut maksimum değerden otomatik olarak başlayacaktır.


1
information_schema'da NULL auto-inc değerini ayarlayacaktır; çekSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun

1
Sürüm 5.6.x'te test ettim ve bu mükemmel çalıştı ve Kerem Güneş'in sorgusu maksimum değeri artı bir değil, belirtildiği gibi boş döndürdü. (belki de ilk sorgudan sonra null olarak ayarlanır, ancak ikinci sorgudan sonra değildir) Bu InnoDB için en iyi çözüm olduğuna inanıyorum.
Frank Forte

Belirlenen açık değerle aynı: "aynı yapıya ve yeni auto_increment değerine sahip yeni bir tablo oluşturun ve orijinal tablodaki tüm kayıtları kopyalayın, orijinali bırakın ve yenisini yeniden adlandırın. Bu, önemli bir performans etkisi (ve disk alanı) içerebilir. tablo büyükse üretim ortamlarında. " ama çok daha kötü çünkü tam kopya tablo iki kez gerekir.
Enyby

Ben bu sürümü için çalıştığını doğrulamak 5.6.15oysa ALTER TABLE tablename AUTO_INCREMENT = 1yapar değil .
Nae

24

Bu soruya verilen en yüksek puanların tümü "ALTER yourtable AUTO_INCREMENT = value" değerini öneriyor. Ancak, bu yalnızca valuedeğiştirmedeki otomatik bağlama sütununun geçerli maksimum değerinden büyük olduğunda çalışır . MySQL 8 belgelerine göre :

Sayacı, kullanılmakta olan değerden küçük veya ona eşit bir değere sıfırlayamazsınız. Hem InnoDB hem de MyISAM için, değer şu anda AUTO_INCREMENT sütunundaki maksimum değerden küçük veya ona eşitse, değer geçerli maksimum AUTO_INCREMENT sütun değeri artı bir değerine sıfırlanır.

Temelde, OP sorunun yalnızca ikinci bölümünde sorduğu için, otomatik giriş sütununun değerini artırmak için yalnızca AUTO_INCREMENT değerini 1 olarak sıfırlayamazsınız. AUTO_INCREMENT öğesini geçerli maks. Değerinden aşağıya doğru ayarlamanıza izin veren seçenekler için, Otomatik artışı birincil anahtarını yeniden sırala / sıfırla'ya bakın .


20

MySQL 5.6'da işlevsellik değiştiği için güncelleme ekleme. MySQL 5.6'dan itibaren InnoDB ile basit ALTER TABLOSU'nu kullanabilirsiniz:

ALTER TABLE tablename AUTO_INCREMENT = 1;

Dokümanlar bunu yansıtacak şekilde güncellenir:

http://dev.mysql.com/doc/refman/5.6/en/alter-table.html

Testim ayrıca tablonun kopyalanmadığını, değerin basitçe değiştirildiğini de gösteriyor.


19

MySQL Autoincrement Sütununu Sıfırlama bölümünde verilen iyi seçenekler vardır

Not ALTER TABLE tablename AUTO_INCREMENT = value;yok değil InnoDb için çalışmak


8
Bunu InnoDB ile nasıl yaparsınız?
EmptyArsenal

4
MySQL v 5.6.2 kullanarak benim için iyi çalışıyor
Eddie B

Bir tablodan kayıtları sildikten sonra bir otomatik görüntüleme alanının sıfırlanamamasına benzer bir sorun yaşadım. TRUNCATE çalışıyormuş gibi görünüyor. Bence otomatik baskıyı gidermek ve daha sonra yeniden uygulamak için aşağıdaki çözümler bunu hafifletmeye yardımcı olabilir.
Craig Maloney

@CraigMaloney - DELETE(veya ROLLBACK) kimlikleri kurtarmaz. Bir istisna: Yeniden başlatmadan (veya kilitlenmeden) sonra, bir sonraki kimliğin hesaplanması MAX(id)+1, böylece sonunda silinmiş kimlikleri etkili bir şekilde kurtarmasıdır . İstisna istisnası: MySQL 8.0 bu kimlikleri kullanılmaz hale getirir.
Rick James

12
ALTER TABLE news_feed DROP id

ALTER TABLE news_feed ADD  id BIGINT( 200 ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id)

Bazı komut dosyalarımda bunu kullandım, id alanı bırakıldı ve önceki ayarlarla geri eklendi, veritabanı tablosundaki tüm alanlar yeni otomatik artış değerleri ile dolduruldu, bu da InnoDB ile çalışmalı.

Tablodaki tüm alanların yeniden sayılacağını ve başka kimlikleri olacağını unutmayın !!!.


3
Böyle bir şeye sahip olmak istiyorum! Ancak ekstra bir uyarı olarak; bu açıkça yabancı anahtarlarınızı tamamen kıracaktır.
NoobishPro

12

Sözdizimi TRUNCATEtablosunu şu şekilde de kullanabilirsiniz : TRUNCATE TABLE table_name

DİKKAT!! TRUNCATE TABLE your_tableolacak her şeyi silmek Gözlerinde farklı your_table!!


14
Yeni programcılar , belirtilen tabloda TÜM satırlarınızıTRUNCATE da sileceğini unutmayın !
Zanshin13

1
Yukarıdaki yorum cevaba veya en azından kesikliğin gerçek kullanımı hakkında bir açıklama eklenmelidir.
Lucas Kauz

TRUNCATEauto_incrementalanları da sıfırlayacak mı? Benim kullanım durumum , tablodaki eski verileri temizlemek ve yeni veriler için kimlikleri 1'den yeniden başlatmaktır (hayal edin, test tamamlandıktan sonra doğru kullanım için tabloyu temizleme). DROPTüm masaya gitmeyi düşündüm ve CREATEyine.
ADTC

Evet, TRUNCATE tablodaki bir sıfırlama gibi çalışır. Bir tablo oluşturulduğundan beri bir tablo DEĞİŞTİRİLDİĞİNDE bu tamamen doğru değildir, o zaman bu değişiklikler sıfırlanmaz. Tablo yapısını dışa aktarmaya ve gerçek bir sıfırlamadan yeni bir tablo oluşturmak için dışa aktarmaya daha yakın olduğunu varsayalım.
Chris

Evet @ ADTC. Geçerli değeri korumak istiyorsanız auto_increment, DELETE FROMyerine kullanın TRUNCATE.
TRiG

8

boş masa içindir:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

Verileriniz varsa ancak düzenlemek istiyorsanız, bunu kullanmanızı öneririz:

ALTER TABLE `table_name` DROP `auto_colmn`;
ALTER TABLE `table_name` ADD  `auto_colmn` INT( {many you want} ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`auto_colmn`);

kullanımı basit
Abdul Aziz Al Basyir

Bu bizim için verilerle çalıştı. Satırı bir sonraki dizine sıfırlar. Teşekkürler!
Mart'ta Dazzle

urwell @Dazzle!
Abdul Aziz Al Basyir

5

İşte benim çözümüm, ancak sütununuz kısıtlamaları varsa veya kötü tablolara sahip olacağı veya hatta çalışmayacağı için diğer tablolara yabancı anahtar olarak bağlanmışsa bunu yapmanızı tavsiye etmeyeceğim.

> Önce: sütunu bırakın

ALTER TABLE tbl_name DROP COLUMN column_id

> İkinci: sütunu yeniden oluşturun ve varsayalım ki ilk sütun olarak İLK olarak ayarlayın.

ALTER TABLE tbl_access ADD COLUMN `access_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST

Bu iyi çalışıyor!


3

MySQL 5.6 itibariyle aşağıdaki yaklaşım çevrimiçi DDL nedeniyle daha hızlı çalışır (not algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;


2

Diziyi sıfırlamak için tabloyu kısaltabilirsiniz

TRUNCATE TABLE TABLE_NAME

1

Tablo değiştirmek ve auto_increment 1 ayarlamak için çalıştı ama işe yaramadı. Artırdığım sütun adını silmeye, sonra tercih ettiğiniz adla yeni bir sütun oluşturmaya ve bu yeni sütunu başlangıcından itibaren artırmaya karar verdim.


bunu nasıl başardığını açıklayabilir misin?
MZaragoza

@MZaragoza Sadece AI olmayan eski sütunu bırakın ve AI özellikli yeni bir sütun oluşturun.
andromeda

Bunu göstermek için cevabınızı güncelleyebilir misiniz? Gerçekten takdir ediyorum
MZaragoza

1

Bir tablo için otomatik artış sayacı iki şekilde ayarlanabilir:

  1. Daha önce açıklandığı gibi bir sorgu yürüterek:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. Workbench veya diğer görsel veritabanı tasarım araçlarını kullanma. Workbench'te nasıl yapıldığını göstereceğim - ancak diğer araçlarda da çok farklı olmamalı. İstediğiniz tabloya sağ tıklayın Alter tableve içerik menüsünden seçim yapın. Altta bir tabloyu değiştirmek için mevcut tüm seçenekleri görebilirsiniz. Seçin Optionsve bu formu alacaksınız: resim açıklamasını buraya girin

    Ardından, alanda Auto incrementgösterilen değeri resimde gösterildiği gibi ayarlamanız yeterlidir. Bu temel olarak ilk seçenekte gösterilen sorguyu yürütür.


0

En son artı bir kimliği güncellemek için

 ALTER TABLE table_name AUTO_INCREMENT = 
 (SELECT (id+1) id FROM table_name order by id desc limit 1);


0

Bu soruyu araştırdım ve buldum, ancak aradığım cevap iki kriteri karşılıyor:

  1. tamamen MySQL sorgularını kullanma
  2. mevcut bir tablo otomatik artışını maks. (id) + 1 değerine sıfırlayın

Burada tam olarak ne istediğimi bulamadığım için, cevabı çeşitli cevaplardan toplayıp burada paylaştım.

Unutulmaması gereken birkaç nokta:

  1. söz konusu tablo InnoDB
  2. tablo, birincil anahtar olarak idtür içeren alanı kullanırint
  3. bunu tamamen MySQL'de yapmanın tek yolu saklı yordamı kullanmaktır
  4. aşağıdaki resimlerim GUI olarak SequelPro kullanıyor. Tercih ettiğiniz MySQL editörüne göre uyarlayabilmelisiniz
  5. Bunu debian-linux-gnu için MySQL Ver 14.14 Distrib 5.5.61 üzerinde test ettim

Adım 1: Saklı Yordam Oluşturma

bunun gibi bir saklı yordam oluşturun:

DELIMITER //
CREATE PROCEDURE reset_autoincrement(IN tablename varchar(200))
BEGIN

      SET @get_next_inc = CONCAT('SELECT @next_inc := max(id) + 1 FROM ',tablename,';');
      PREPARE stmt FROM @get_next_inc; 
      EXECUTE stmt; 
      SELECT @next_inc AS result;
      DEALLOCATE PREPARE stmt; 

      set @alter_statement = concat('ALTER TABLE ', tablename, ' AUTO_INCREMENT = ', @next_inc, ';');
      PREPARE stmt FROM @alter_statement;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

Sonra çalıştırın.

Çalıştırılmadan önce, veritabanınızdaki Saklı Yordamlar'ın altına baktığınızda şöyle görünür.

resim açıklamasını buraya girin

Çalıştırdığımda, saklı yordamı seçiyorum ve Seçimi Çalıştır'a basıyorum

resim açıklamasını buraya girin

Not: ayırıcılar kısmı çok önemlidir. Bu nedenle, bu soruda seçilen en iyi yanıtlardan kopyalayıp yapıştırırsanız, bu nedenle çalışmazlar.

Çalıştırdıktan sonra, saklı yordamı görmeliyim

resim açıklamasını buraya girin

Saklı yordamı değiştirmeniz gerekirse, saklı yordamı silmeniz ve ardından yeniden çalıştırmayı seçmeniz gerekir.

Adım 2: Saklı yordamı çağırın

Bu sefer normal MySQL sorgularını kullanabilirsiniz.

call reset_autoincrement('products');

Başlangıçta kendi SQL sorgularımdan https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc adresindeki notlar ve StackOverflow için uyarlanmış


0
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;

-1

Bu Sorguyu Çalıştır'ı deneyin

 ALTER TABLE tablename AUTO_INCREMENT = value;

Veya Otomatik Sorguyu Sıfırla için Bu Sorguyu Deneyin

 ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL;

Ve Otomatik Artışı Ayarlayın Sonra Bu Sorguyu Çalıştırın

  ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;

-2

Sorgu Tarayıcısına gitmenizi ve aşağıdakileri yapmanızı öneririm:

  1. Şemaya gidin ve değiştirmek istediğiniz tabloyu bulun.
  2. Sağ tıklayın ve kopya oluştur ifadesini seçin.
  3. Bir sonuç sekmesi açın ve create deyimini yapıştırın.
  4. Create deyiminin son satırına gidin ve Auto_Increment = N öğesini arayın (Burada N, auto_increment alanı için geçerli bir sayıdır.)
  5. N'yi 1 ile değiştirin.
  6. ctrl+enter Tuşuna basın .

Tabloda yeni satıra girdiğinizde otomatik_dönüş bire sıfırlanmalıdır.

Eğer bir auto_increment alan değeri zaten mevcut bir satır eklemek çalışırsanız ne olacağını bilmiyorum.

Umarım bu yardım!


-2

En iyi yol, alanı AI ile kaldırmak ve AI ile tekrar eklemek, tüm tablolar için çalışır


1
en iyi yol değil, bir sütunu bırakmak sütun verilerini kaybeder
Disha Goyal
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.