Bagaimana cara mengatur ulang AUTO_INCREMENT di MySQL?


1246

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


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.


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

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


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.


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.


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 .


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.


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


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 !!!.


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!!


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`);

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!


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;


2

Anda cukup memotong tabel untuk mengatur ulang urutan

TRUNCATE TABLE TABLE_NAME

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.


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.


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);


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


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

-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;

-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!


-2

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


1
bukan cara terbaik sama sekali, menjatuhkan kolom akan kehilangan data kolom
Disha Goyal
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.