Otomatik artış başlangıç ​​numarası değiştirilsin mi?


264

MySQL, bir tablo var ve bunun yerine auto_incrementdeğeri ayarlamak istiyorum . Bu mümkün mü ve hangi sorgu ifadesi bunu yapıyor?51


DEĞİŞTİREMEZSİNİZ, sadece
yükselin

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. kaynağıauto_increment Ed sütununuzu ayarlamak istediğiniz değerden daha yüksek bir değer yoksa, değeri de azaltabilirsiniz. ( MySQL belgeleri )
Seyfahni

Yanıtlar:


520

ALTER TABLEAuto_increment başlangıç ​​değerini değiştirmek için kullanabilirsiniz :

ALTER TABLE tbl AUTO_INCREMENT = 5;

Daha fazla ayrıntı için MySQL referansına bakın.


6
Alter olmadan yapmanın mümkün olup olmadığını bilen var mı?
thesmart

3
Evet mümkün. Cevabımı gör.
Cosimo

3
MySQL 5.6, AUTO_INCREMENTdeğeri azaltmanıza izin vermeyecek bir hataya sahipti , ancak 5.6.16 ve 5.7.4'te düzeltildi, bkz. Bugs.mysql.com/bug.php?id=69882
Daniel Vandersluis

3
Bunu yaparsanız, masonun yeniden inşa edilmesiyle ilgili cosimo'nun uyarısına bir göz atın!
h00ligan

15
Açıklığa kavuşturmak için: Başlangıç ​​değerinin 5 olarak ayarlanması, bir sonraki ekin 5 olacağı anlamına gelir.
Steen Schütt

97

Evet, ALTER TABLE t AUTO_INCREMENT = 42ifadeyi kullanabilirsiniz . Ancak, bunun en azından InnoDB ve belirli MySQL sürümleriyle tüm tablonuzun yeniden oluşturulmasına neden olacağını bilmeniz gerekir. Halihazırda milyonlarca satırı olan bir veri kümeniz varsa, tamamlanması çok uzun sürebilir .

Deneyimlerime göre, aşağıdakileri yapmak daha iyidir:

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

Bu şekilde, işlemi geri alsanız bile , MySQL otomatik artış değerini koruyacak ve değişiklik anında uygulanacaktır.

Bir SHOW CREATE TABLE tifade vererek bunu doğrulayabilirsiniz . Görmelisin:

> SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
...
) ENGINE=InnoDB AUTO_INCREMENT=43 ...

5
TEŞEKKÜRLER! SET foreign_key_checks = 0;bunun için de yararlıdır.
dnozay

Parlak fikir! Nitpick: SHOW CREATE TABLE taslında dönecektir 43, yani yerleştirdikten sonra bir sonraki değer 42.
petrkotek

2
@cosimo, Bekle, bu belgesiz değil mi? Kılavuz bu şekilde çalışması gerektiğini söyledi mi? Değilse farklı (gelecekteki) bir mysql kurulumunda kırılabilir.
Pacerier

1
@ Pacer evet, haklısın. Bu MySQL'in şu anki çalışma şekline dayanmaktadır. Gelecekte böyle çalışmayabilir. MySQL geçmişi göz önüne alındığında, uzun bir süre bu şekilde çalışmaya devam edeceğini varsayacağım.
Cosimo

@cosimo, İnşallah güvenilir kod aslında bu iyi kesmek kullanabilirsiniz belgelemek. Şu andan itibaren güvenilir olmak isteyen kod bunu kullanamaz.
Pacerier

13

MySQL'de 10'dan başlayarak bir artırım nasıl otomatikleştirilir:

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'

Bu otomatik olarak id sütununu 10'dan başlayarak birer birer artırır.

10'dan başlayarak 5'e kadar MySQL'de otomatik artış:

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'

Bu, otomatik olarak kimlik sütununu 10'dan başlayarak her seferinde 5 artırır.


5

Tablonun AUTO_INCREMENT değerini otomatik düzeltme prosedürü

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

3

Değişken alan adları için bu yordama ihtiyacınız varsa, bunun yerine idyardımcı olabilir:

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

2

Bunu phpmyadmin kullanarak da yapabilirsiniz. Sadece eylemlere gitmek yerine tabloyu seçin. Ve tablo artışlarının altındaki Otomatik artış değerini değiştirin. Başlat'a tıklamayı unutmayın Phpmyadmin'de otomatik artış


-2

sadece tabloyu veri ile dışa aktar .. sonra sql kopyalamak gibi

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 ;

şimdi otomatik artış değerini değiştirin ve sql'yi yürütün.

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.