Ubah nomor awal kenaikan otomatis?

264

Dalam MySQL, saya punya meja, dan saya ingin mengatur auto_incrementnilai 5bukan 1. Apakah ini mungkin dan pernyataan permintaan apa yang melakukan ini?

John Jones
sumber
Anda tidak dapat MENGUBAH, hanya meningkat
Vasilii Suricov
1
@VasiliiSuricov You can change this option with ALTER TABLE, but in that case the new value must be higher than the highest value which is present in the AUTO_INCREMENT column. source Jika tidak ada nilai yang lebih tinggi dari apa yang Anda ingin atur auto_incrementkolom ed Anda, Anda juga dapat mengurangi nilainya. ( dokumentasi mysql )
seyfahni

Jawaban:

520

Anda dapat menggunakan ALTER TABLEuntuk mengubah nilai awal auto_increment:

ALTER TABLE tbl AUTO_INCREMENT = 5;

Lihat referensi MySQL untuk lebih jelasnya.

Daniel Vandersluis
sumber
6
Adakah yang tahu apakah mungkin melakukan TANPA ALTER?
smartphone
3
Iya itu mungkin. Lihat balasan saya.
Cosimo
3
MySQL 5.6 memiliki bug yang tidak memungkinkan Anda menurunkan AUTO_INCREMENTnilainya, tetapi telah diperbaiki di 5.6.16 dan 5.7.4, lihat bugs.mysql.com/bug.php?id=69882
Daniel Vandersluis
3
Lihatlah peringatan cosimo tentang meja yang sedang dibangun kembali jika Anda melakukan ini!
h00ligan
15
Untuk memperjelas: Menetapkan nilai awal ke 5, berarti bahwa sisipan berikutnya adalah 5.
Steen Schütt
97

Ya, Anda bisa menggunakan ALTER TABLE t AUTO_INCREMENT = 42pernyataan itu. Namun, Anda perlu menyadari bahwa ini akan menyebabkan pembangunan kembali seluruh tabel Anda, setidaknya dengan InnoDB dan versi MySQL tertentu. Jika Anda memiliki dataset yang sudah ada dengan jutaan baris, mungkin perlu waktu yang sangat lama untuk diselesaikan .

Dalam pengalaman saya, lebih baik melakukan hal berikut:

BEGIN WORK;
-- You may also need to add other mandatory columns and values
INSERT INTO t (id) VALUES (42);
ROLLBACK;

Dengan cara ini, bahkan jika Anda mengembalikan transaksi, MySQL akan mempertahankan nilai kenaikan otomatis, dan perubahan akan diterapkan secara instan.

Anda dapat memverifikasi ini dengan mengeluarkan SHOW CREATE TABLE tpernyataan. Anda harus melihat:

> SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
...
) ENGINE=InnoDB AUTO_INCREMENT=43 ...
Cosimo
sumber
5
TERIMA KASIH! SET foreign_key_checks = 0;juga berguna untuk ini.
dnozay
Ide brilian! Nitpick: SHOW CREATE TABLE tbenar-benar akan kembali 43, yaitu nilai berikutnya setelah memasukkan 42.
petrkotek
2
@cosimo, Tunggu, bukankah ini tidak berdokumen ? Apakah manual mengatakan bahwa itu harus berfungsi seperti itu? Jika tidak, itu mungkin rusak dalam pengaturan mysql (masa depan) yang berbeda.
Pacerier
1
@Pacerier ya, Anda benar. Ini bergantung pada cara kerja MySQL saat ini. Mungkin tidak akan berfungsi seperti itu di masa depan. Mengingat sejarah MySQL, saya akan menganggap itu akan terus bekerja seperti itu untuk waktu yang lama.
Cosimo
@cosimo, Semoga mereka akan mendokumentasikannya sehingga kode yang andal benar-benar dapat menggunakan hack yang baik ini Sampai sekarang, kode yang ingin diandalkan tidak dapat menggunakan ini.
Pacerier
13

Cara menambahkan otomatis satu per satu, mulai dari 10 di MySQL:

create table foobar(
  id             INT PRIMARY KEY AUTO_INCREMENT,
  moobar         VARCHAR(500)
); 
ALTER TABLE foobar AUTO_INCREMENT=10;

INSERT INTO foobar(moobar) values ("abc");
INSERT INTO foobar(moobar) values ("def");
INSERT INTO foobar(moobar) values ("xyz");

select * from foobar;

'10', 'abc'
'11', 'def'
'12', 'xyz'

Otomatis ini menambah kolom id dengan satu mulai dari 10.

Peningkatan otomatis dalam MySQL sebesar 5, mulai dari 10:

drop table foobar
create table foobar(
  id             INT PRIMARY KEY AUTO_INCREMENT,
  moobar         VARCHAR(500)
); 
SET @@auto_increment_increment=5;
ALTER TABLE foobar AUTO_INCREMENT=10;

INSERT INTO foobar(moobar) values ("abc");
INSERT INTO foobar(moobar) values ("def");
INSERT INTO foobar(moobar) values ("xyz");

select * from foobar;
'11', 'abc'
'16', 'def'
'21', 'xyz'

Otomatis ini menambah kolom id sebanyak 5 setiap kali, mulai dari 10.

Eric Leschinski
sumber
5

Prosedur untuk memperbaiki nilai tabel AUTO_INCREMENT secara otomatis

DROP PROCEDURE IF EXISTS update_auto_increment;
DELIMITER //
CREATE PROCEDURE update_auto_increment (_table VARCHAR(64))
BEGIN
    DECLARE _max_stmt VARCHAR(1024);
    DECLARE _stmt VARCHAR(1024);    
    SET @inc := 0;

    SET @MAX_SQL := CONCAT('SELECT IFNULL(MAX(`id`), 0) + 1 INTO @inc FROM ', _table);
    PREPARE _max_stmt FROM @MAX_SQL;
    EXECUTE _max_stmt;
    DEALLOCATE PREPARE _max_stmt;

    SET @SQL := CONCAT('ALTER TABLE ', _table, ' AUTO_INCREMENT =  ', @inc);
    PREPARE _stmt FROM @SQL;
    EXECUTE _stmt;
    DEALLOCATE PREPARE _stmt;
END//
DELIMITER ;

CALL update_auto_increment('your_table_name')
Zhitko Vladimir
sumber
3

Jika Anda memerlukan prosedur ini untuk nama bidang variabel, idini mungkin berguna:

DROP PROCEDURE IF EXISTS update_auto_increment;
DELIMITER //
CREATE PROCEDURE update_auto_increment (_table VARCHAR(128), _fieldname VARCHAR(128))
BEGIN
    DECLARE _max_stmt VARCHAR(1024);
    DECLARE _stmt VARCHAR(1024);    
    SET @inc := 0;

    SET @MAX_SQL := CONCAT('SELECT IFNULL(MAX(',_fieldname,'), 0) + 1 INTO @inc FROM ', _table);
    PREPARE _max_stmt FROM @MAX_SQL;
    EXECUTE _max_stmt;
    DEALLOCATE PREPARE _max_stmt;

    SET @SQL := CONCAT('ALTER TABLE ', _table, ' AUTO_INCREMENT =  ', @inc);
    PREPARE _stmt FROM @SQL;
    EXECUTE _stmt;
    DEALLOCATE PREPARE _stmt;
END //
DELIMITER ;

CALL update_auto_increment('your_table_name', 'autoincrement_fieldname');
Thomas K.
sumber
2

Anda juga dapat melakukannya menggunakan phpmyadmin. Cukup pilih tabel daripada pergi ke tindakan. Dan ubah opsi kenaikan otomatis di bawah tabel. Jangan lupa klik saat mulai Peningkatan otomatis di phpmyadmin

Angin utara
sumber
-2

cukup ekspor tabel dengan data .. lalu salin seperti sql-nya

CREATE TABLE IF NOT EXISTS `employees` (
  `emp_badgenumber` int(20) NOT NULL AUTO_INCREMENT,
  `emp_fullname` varchar(100) NOT NULL,
  `emp_father_name` varchar(30) NOT NULL,
  `emp_mobile` varchar(20) DEFAULT NULL,
  `emp_cnic` varchar(20) DEFAULT NULL,
  `emp_gender` varchar(10) NOT NULL,
  `emp_is_deleted` tinyint(4) DEFAULT '0',
  `emp_registration_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `emp_overtime_allowed` tinyint(4) DEFAULT '1',
  PRIMARY KEY (`emp_badgenumber`),
  UNIQUE KEY `bagdenumber` (`emp_badgenumber`),
  KEY `emp_badgenumber` (`emp_badgenumber`),
  KEY `emp_badgenumber_2` (`emp_badgenumber`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=111121326 ;

sekarang ubah nilai kenaikan otomatis dan jalankan sql.

pengguna1911721
sumber