Bagaimana cara mengatur ulang AUTO_INCREMENT di MySQL?

1246

Bagaimana bisa saya mengatur ulang tersebutAUTO_INCREMENTdari lapangan?
Saya ingin mulai menghitung dari1lagi.

Home run
sumber
9
Anda mungkin mendapatkan respons yang lebih baik di situs untuk DBA di dba.stackexchange.com
Rowland Shaw
80
Anda mungkin ingin mengosongkan meja juga:TRUNCATE TABLE yourTableName;
Konerak
3
ya, truncate table adalah yang terbaik dalam hal ini. itu juga mengatur ulang mulai kenaikan otomatis ke 1.
raidsan
2
Terkadang Anda tidak memiliki izin untuk TRUNCATE karena memerlukan izin DROP.
Luke Cousins

Jawaban:

2024

Anda dapat mengatur ulang penghitung dengan:

ALTER TABLE tablename AUTO_INCREMENT = 1

Untuk InnoDB Anda tidak dapat menetapkan auto_incrementnilai lebih rendah atau sama dengan indeks saat ini tertinggi. (kutipan dari ViralPatel ):

Perhatikan bahwa Anda tidak dapat mengatur ulang penghitung ke nilai yang kurang dari atau sama dengan yang sudah digunakan. Untuk MyISAM, jika nilainya kurang dari atau sama dengan nilai maksimum saat ini di kolom AUTO_INCREMENT, nilainya diatur ulang ke maksimum saat ini ditambah satu. Untuk InnoDB, jika nilainya kurang dari nilai maksimum saat ini di kolom, tidak ada kesalahan terjadi dan nilai urutan saat ini tidak berubah.

Lihat Cara Mengatur Ulang MySQL AutoIncrement menggunakan nilai MAX dari tabel lain? tentang bagaimana secara dinamis mendapatkan nilai yang dapat diterima.

Niels
sumber
8
Ini bisa berlangsung selamanya untuk tabel yang diisi. Hati-hati dengan ini: stackoverflow.com/questions/2681869/…
BT
52
ini adalahcircular reference
Besnik
5
Apa maksudmu curcular reference?
Niels
73
Ingatlah bahwa MySql akan membuat tabel baru, dengan struktur yang sama dan nilai auto_increment baru dan salin semua catatan dari tabel asli, jatuhkan yang asli dan ganti nama yang baru. Ini bisa memiliki dampak kinerja yang cukup besar (dan ruang disk) pada lingkungan produksi jika tabelnya besar.
Rostol
6
Apakah jawaban yang dipilih ini benar-benar berfungsi jika Anda sudah memiliki kolom AUTOINCREMENT? Menurut dokumen MySQL 5.1: "Anda tidak dapat mengatur ulang penghitung ke nilai yang kurang dari atau sama dengan yang telah digunakan. Untuk MyISAM, jika nilainya kurang dari atau sama dengan nilai maksimum saat ini di kolom AUTO_INCREMENT, nilai diatur ulang ke maksimum saat ini ditambah satu. Untuk InnoDB, jika nilainya kurang dari nilai maksimum saat ini di kolom, tidak ada kesalahan terjadi dan nilai urutan saat ini tidak berubah. " Suara seperti tidak akan terjadi di sini jika autoincrement lebih besar dari 1.
lreeder
160
ALTER TABLE tablename AUTO_INCREMENT = 1
boobiq
sumber
7
Bolehkah saya tahu apa perbedaan antara jawaban Anda dan jawaban sebelumnya
Praveen Srinivasan
30
@PraveenSrinivasan tidak ada perbedaan, kami menambahkan mereka pada saat yang sama
boobiq
79
Secara pribadi, saya pikir itu adalah hal yang indah bahwa kedua jawaban untuk pertanyaan AUTO_INCREMENT ini memiliki tabrakan konkurensi :-)
Mark Goldfain
@ MarkGoldfain ya itu!
ncomputer
concurrency akan menyebabkan kondisi lomba mysql ...
Syamsoul Azrien
81
SET  @num := 0;

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

ALTER TABLE your_table AUTO_INCREMENT =1;

Saya pikir ini akan melakukannya

nghiepit
sumber
2
Pertanyaan ini sudah memiliki jawaban yang tepat. Selanjutnya, Anda UPDATEakan memperbarui semua nilai dalam idkolom.
Kermit
2
OP tidak menyatakan bahwa mereka memesan ulang baris yang ada.
Kermit
Jawaban lengkap dan sempurna. Tetapi saya ragu bahwa ketika kita memasukkan nilai baru apa yang akan menjadi PK dari nilai itu. Apakah itu 1 atau PK berikutnya?
Prifulnath
ya ini adalah solusi terbaik, tetapi Anda mungkin ingin mengunci tabel jika ada data yang sedang ditulis misalnya tabel produksi
wavvves
sangat membantu, saya memiliki syarat yang sama di mana saya harus mengatur ulang kenaikan otomatis untuk memulai dengan 1, hanya dua perintah pertama yang membantu.
LOKENDRA
40

masukkan deskripsi gambar di siniAda cara yang sangat mudah dengan phpmyadmin di bawah tab "operasi", Anda dapat mengatur, dalam opsi tabel, peningkatan otomatis ke nomor yang Anda inginkan.

Miles M.
sumber
Anda perlu me-restart layanan mysql / server segera setelah itu.
Cyber
1
Saya pikir Anda tidak perlu me-restart server Anda setelah itu. PhpAdmin hanya akan menjalankan perintah untuk mengubah titik awal kenaikan.
Kareem
Anda tidak perlu memulai ulang, ini akan berlaku dari sisipan berikutnya.
IlludiumPu36
36

Solusi terbaik yang bekerja untuk saya:

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

Cepat, bekerja dengan innoDB, dan saya tidak perlu tahu nilai maksimum saat ini! Dengan cara ini penghitung kenaikan otomatis akan mengatur ulang dan itu akan mulai secara otomatis dari nilai maksimum yang ada.

trust_words
sumber
1
itu akan menetapkan nilai auto-inc NULL pada information_schema; checkSELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;
K-Gun
1
Saya menguji pada versi 5.6.x dan ini bekerja dengan sempurna, dan permintaan oleh Kerem Güneş mengembalikan nilai max plus satu, BUKAN nol seperti yang dinyatakan. (mungkin disetel ke nol setelah kueri pertama, tetapi bukan setelah kueri kedua) Saya percaya ini adalah solusi terbaik untuk InnoDB.
Frank Forte
Sama seperti menetapkan nilai eksplisit: "buat tabel baru, dengan struktur yang sama dan nilai auto_increment baru dan salin semua catatan dari tabel asli, jatuhkan yang asli dan ganti nama yang baru. Ini bisa memiliki dampak kinerja yang cukup besar (dan ruang disk) pada lingkungan produksi jika meja besar. " tetapi jauh lebih buruk karena perlu tabel salinan lengkap dua kali.
Enyby
Saya memverifikasi bahwa ini bekerja untuk versi 5.6.15, sedangkan ALTER TABLE tablename AUTO_INCREMENT = 1tidak tidak .
Nae
24

Jawaban dengan nilai tertinggi untuk pertanyaan ini semuanya merekomendasikan "ALTER yourtable AUTO_INCREMENT = value". Namun, ini hanya berfungsi ketika valuedi alter lebih besar dari nilai maks saat ini dari kolom peningkatan otomatis. Menurut dokumentasi MySQL 8 :

Anda tidak dapat mengatur ulang penghitung ke nilai yang kurang dari atau sama dengan nilai yang saat ini digunakan. Untuk InnoDB dan MyISAM, jika nilainya kurang dari atau sama dengan nilai maksimum yang saat ini ada di kolom AUTO_INCREMENT, nilainya diatur ulang ke nilai kolom AUTO_INCREMENT maksimum saat ini ditambah satu.

Intinya, Anda hanya dapat mengubah AUTO_INCREMENT untuk meningkatkan nilai kolom peningkatan otomatis, bukan mengatur ulangnya menjadi 1, karena OP bertanya di bagian kedua pertanyaan. Untuk opsi yang benar-benar memungkinkan Anda mengatur AUTO_INCREMENT ke bawah dari maksnya saat ini, lihat Menyusun Ulang / reset kunci primer kenaikan otomatis .

lreeder
sumber
20

Menambahkan pembaruan karena fungsi berubah di MySQL 5.6. Pada MySQL 5.6 Anda BISA menggunakan ALTER TABLE sederhana dengan InnoDB:

ALTER TABLE tablename AUTO_INCREMENT = 1;

Dokumen diperbarui untuk mencerminkan ini:

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

Pengujian saya juga menunjukkan bahwa tabel TIDAK disalin, nilainya hanya diubah.

SeanN
sumber
19

Ada opsi bagus yang diberikan di Cara Mengatur Ulang Kolom MySQL Autoincrement

Perhatikan bahwa ALTER TABLE tablename AUTO_INCREMENT = value;tidak tidak bekerja untuk InnoDB

Naz
sumber
8
Apakah Anda bagaimana melakukan ini dengan InnoDB?
EmptyArsenal
4
Bekerja dengan baik untuk saya menggunakan MySQL v 5.6.2
Eddie B
Saya memiliki masalah serupa di mana bidang peningkatan otomatis tidak mendapatkan ulang setelah saya menghapus catatan dari tabel. TRUNCATE tampaknya telah berfungsi. Saya pikir solusi di bawah ini untuk menghapus autoincrement dan kemudian mendaftar ulang dapat membantu meringankan ini.
Craig Maloney
@CraigMaloney - DELETE(atau ROLLBACK) tidak akan memulihkan id. Satu pengecualian: Setelah restart (atau crash), id berikutnya dihitung MAX(id)+1, dengan demikian secara efektif memulihkan id yang dihapus pada akhirnya . Pengecualian untuk pengecualian: MySQL 8.0 membuat id tersebut tidak digunakan.
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)

Saya menggunakan ini di beberapa skrip saya, bidang id turun dan kemudian ditambahkan kembali dengan pengaturan sebelumnya, semua bidang yang ada dalam tabel database diisi dengan nilai kenaikan otomatis baru, ini juga harus bekerja dengan InnoDB.

Perhatikan bahwa semua bidang dalam tabel akan dihitung ulang dan akan memiliki id lainnya !!!.

Alin Razvan
sumber
3
Saya ingin memiliki yang seperti ini! Namun sebagai peringatan ekstra; ini jelas akan benar-benar menghancurkan kunci asing Anda.
NoobishPro
12

Anda juga dapat menggunakan TRUNCATEtabel sintaks seperti ini: TRUNCATE TABLE table_name

WASPADALAH !! TRUNCATE TABLE your_tableakan menghapus semua yang ada di your_table!!

Manohar Kumar
sumber
14
Pemrogram baru , ketahuilah bahwa TRUNCATEini juga akan menghapus SEMUA baris Anda di tabel yang ditentukan!
Zanshin13
1
Komentar di atas harus dimasukkan dalam jawaban, atau setidaknya penjelasan tentang penggunaan truncate yang sebenarnya.
Lucas Kauz
TRUNCATEakan mengatur ulang auto_incrementbidang juga? Kasus penggunaan saya adalah untuk menghapus data lama dalam tabel dan mulai ID dari 1 lagi untuk data baru (bayangkan, membersihkan tabel untuk penggunaan yang benar setelah pengujian selesai). Saya pikir saya harus ke DROPseluruh meja dan CREATElagi.
ADTC
Ya, TRUNCATE berfungsi seperti reset di atas meja. Itu tidak sepenuhnya benar jika tabel telah diubah sejak membuatnya maka perubahan itu tidak akan diatur ulang. Saya kira ini lebih dekat dengan mengekspor struktur tabel dan dan menggunakan ekspor untuk membuat tabel baru daripada reset yang sebenarnya.
Chris
Ya @ADTC. Jika Anda ingin mempertahankan nilai saat ini auto_increment, gunakan DELETE FROMsebagai ganti TRUNCATE.
TRiG
8

itu untuk tabel kosong:

ALTER TABLE `table_name` AUTO_INCREMENT = 1;

jika Anda memiliki data tetapi Anda ingin merapikannya, saya sarankan gunakan ini:

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`);
Abdul Aziz Al Basyir
sumber
mudah digunakan ini
Abdul Aziz Al Basyir
Ini bekerja untuk kami dengan data. Ini mengatur ulang baris ke indeks berikutnya. Terima kasih!
Dazzle
urwell @Dazzle!
Abdul Aziz Al Basyir
5

Inilah solusi saya, tetapi saya tidak akan menyarankan untuk melakukan ini jika kolom Anda memiliki kendala atau terhubung sebagai kunci asing ke tabel lain karena akan memiliki efek buruk atau bahkan tidak akan berfungsi.

> Pertama: jatuhkan kolom

ALTER TABLE tbl_name DROP COLUMN column_id

> Kedua: buat ulang kolom dan atur sebagai PERTAMA jika Anda menginginkannya sebagai kolom pertama yang saya asumsikan.

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

Ini bekerja dengan baik!

bdalina
sumber
3

Pada MySQL 5.6 pendekatan di bawah ini bekerja lebih cepat karena DDL online (catatan algorithm=inplace):

alter table tablename auto_increment=1, algorithm=inplace;

artsafin
sumber
2

Anda cukup memotong tabel untuk mengatur ulang urutan

TRUNCATE TABLE TABLE_NAME
Kunwar Babu
sumber
1

Saya mencoba mengubah tabel dan mengatur auto_increment ke 1 tetapi tidak berhasil. Saya memutuskan untuk menghapus nama kolom yang saya tambahkan, kemudian buat kolom baru dengan nama pilihan Anda dan atur kolom baru itu untuk ditambahkan dari awal.

andromeda
sumber
dapatkah Anda menjelaskan bagaimana Anda mewujudkannya?
MZaragoza
@MZaragoza Cukup jatuhkan kolom lama yang tidak memiliki AI lalu buat yang baru yang memiliki AI diaktifkan.
andromeda
Bisakah Anda memperbarui jawaban Anda untuk menunjukkan ini. Saya akan sangat menghargainya
MZaragoza
1

Penghitung kenaikan otomatis untuk tabel dapat (diatur ulang) dengan dua cara:

  1. Dengan menjalankan kueri, seperti yang sudah dijelaskan orang lain:

    ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;

  2. Menggunakan Workbench atau alat desain database visual lainnya. Saya akan menunjukkan di Workbench bagaimana hal itu dilakukan - tetapi seharusnya tidak jauh berbeda dengan alat lain juga. Dengan mengklik kanan pada tabel yang diinginkan dan memilih Alter tabledari menu konteks. Di bagian bawah Anda dapat melihat semua opsi yang tersedia untuk mengubah tabel. Pilih Optionsdan Anda akan mendapatkan formulir ini: masukkan deskripsi gambar di sini

    Kemudian cukup atur nilai yang diinginkan di bidang Auto incrementseperti yang ditunjukkan pada gambar. Ini pada dasarnya akan mengeksekusi query yang ditunjukkan pada opsi pertama.

Kristijan Iliev
sumber
0

Untuk memperbarui terbaru ditambah satu id

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

ALTER TABLE tablename AUTO_INCREMENT = 1

santosh mahule
sumber
0

Saya mencari di Google dan menemukan pertanyaan ini, tetapi jawaban yang saya cari memenuhi dua kriteria:

  1. menggunakan query MySQL murni
  2. setel ulang kenaikan otomatis tabel yang ada ke maks (id) + 1

Karena saya tidak dapat menemukan apa yang saya inginkan di sini, saya membuat jawaban dari berbagai jawaban dan membagikannya di sini.

Beberapa hal yang perlu diperhatikan:

  1. tabel yang dimaksud adalah InnoDB
  2. tabel menggunakan bidang iddengan tipe sebagaiint kunci utama
  3. satu-satunya cara untuk melakukan ini murni di MySQL adalah dengan menggunakan prosedur tersimpan
  4. gambar saya di bawah ini menggunakan SequelPro sebagai GUI. Anda harus dapat mengadaptasinya berdasarkan editor MySQL pilihan Anda
  5. Saya telah menguji ini pada MySQL Ver 14.14 Distrib 5.5.61, untuk debian-linux-gnu

Langkah 1: Buat Prosedur Tersimpan

buat prosedur tersimpan seperti ini:

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 ;

Kemudian jalankan.

Sebelum dijalankan, ini terlihat seperti ini ketika Anda melihat di bawah Prosedur Tersimpan di database Anda.

masukkan deskripsi gambar di sini

Ketika saya menjalankan, saya cukup memilih prosedur yang tersimpan dan tekan Run Selection

masukkan deskripsi gambar di sini

Catatan: bagian pembatas sangat penting. Karenanya, jika Anda menyalin dan menempel dari jawaban yang dipilih teratas dalam pertanyaan ini, mereka cenderung tidak bekerja karena alasan ini.

Setelah saya menjalankan, saya harus melihat prosedur yang tersimpan

masukkan deskripsi gambar di sini

Jika Anda perlu mengubah prosedur tersimpan, Anda harus menghapus prosedur tersimpan, lalu pilih untuk menjalankan lagi.

Langkah 2: Panggil prosedur yang tersimpan

Kali ini Anda cukup menggunakan kueri MySQL normal.

call reset_autoincrement('products');

Awalnya dari catatan kueri SQL saya sendiri di https://simkimsia.com/library/sql-queries/#mysql-reset-autoinc dan diadaptasi untuk StackOverflow

Kim Stacks
sumber
0
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
Mihai Galan
sumber
-1

Coba Jalankan Pertanyaan Ini

 ALTER TABLE tablename AUTO_INCREMENT = value;

Atau Coba Kueri Ini Untuk Setel Ulang Secara Otomatis

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

Dan Setel Peningkatan Otomatis Kemudian Jalankan Pertanyaan Ini

  ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
Shabeer Sha
sumber
-2

Saya sarankan Anda pergi ke Query Browser dan lakukan yang berikut:

  1. Buka schemata dan temukan tabel yang ingin Anda ubah.
  2. Klik kanan dan pilih salin buat pernyataan.
  3. Buka tab hasil dan rekatkan pernyataan buat mereka.
  4. Pergi ke baris terakhir pernyataan create dan cari Auto_Increment = N, (Di mana N adalah angka saat ini untuk bidang auto_increment.)
  5. Ganti N dengan 1.
  6. Tekan ctrl+enter .

Auto_increment akan diatur ulang menjadi satu setelah Anda memasukkan baris baru ke dalam tabel.

Saya tidak tahu apa yang akan terjadi jika Anda mencoba menambahkan baris di mana nilai bidang auto_increment sudah ada.

Semoga bantuan ini!

jeson
sumber
-2

Cara terbaik adalah menghapus bidang dengan AI dan menambahkannya lagi dengan AI, berfungsi untuk semua tabel

Pemarah
sumber
1
bukan cara terbaik sama sekali, menjatuhkan kolom akan kehilangan data kolom
Disha Goyal