Startnummer für automatische Inkrementierung ändern?

263

In MySQL habe ich eine Tabelle und möchte den auto_incrementWert auf 5anstatt setzen 1. Ist das möglich und welche Abfrageanweisung macht das?

John Jones
quelle
Sie können nicht ändern, nur erhöhen
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. Quelle Wenn es keinen höheren Wert gibt als den, den Sie für Ihre auto_incremented-Spalte festlegen möchten , können Sie den Wert auch verringern. ( MySQL-Dokumentation )
Seyfahni

Antworten:

519

Sie können ALTER TABLEden Anfangswert von auto_increment ändern:

ALTER TABLE tbl AUTO_INCREMENT = 5;

Weitere Informationen finden Sie in der MySQL-Referenz .

Daniel Vandersluis
quelle
6
Weiß jemand, ob es möglich ist, OHNE ÄNDERUNG zu tun?
Thesmart
3
Ja es ist möglich. Siehe meine Antwort.
Cosimo
3
MySQL 5.6 hatte einen Fehler, durch den Sie den AUTO_INCREMENTWert nicht verringern konnten. Er wurde jedoch in 5.6.16 und 5.7.4 behoben. Siehe bugs.mysql.com/bug.php?id=69882
Daniel Vandersluis
3
Schauen Sie sich die Warnung von cosimo an, dass der Tisch in diesem Fall wieder aufgebaut wird!
h00ligan
15
Zur Verdeutlichung: Wenn Sie den Anfangswert auf 5 setzen, bedeutet dies, dass die nächste Einfügung 5 ist.
Steen Schütt
97

Ja, Sie können die ALTER TABLE t AUTO_INCREMENT = 42Anweisung verwenden. Sie müssen sich jedoch bewusst sein, dass dies die Neuerstellung Ihrer gesamten Tabelle verursacht, zumindest mit InnoDB und bestimmten MySQL-Versionen. Wenn Sie über ein bereits vorhandenes Dataset mit Millionen von Zeilen verfügen, kann die Fertigstellung sehr lange dauern .

Nach meiner Erfahrung ist es besser, Folgendes zu tun:

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

Auf diese Weise behält MySQL den Wert für die automatische Inkrementierung bei , selbst wenn Sie die Transaktion zurücksetzen, und die Änderung wird sofort angewendet.

Sie können dies überprüfen, indem Sie eine SHOW CREATE TABLE tErklärung abgeben. Das solltest du sehen:

> SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
...
) ENGINE=InnoDB AUTO_INCREMENT=43 ...
Cosimo
quelle
5
VIELEN DANK! SET foreign_key_checks = 0;ist auch dafür nützlich.
dnozay
Brilliante Idee! Nitpick: Gibt SHOW CREATE TABLE ttatsächlich zurück 43, dh den nächsten Wert nach dem Einfügen 42.
Petrkotek
2
@cosimo, Warte, ist das nicht undokumentiert ? Hat das Handbuch gesagt, dass es so funktionieren soll? Wenn nicht, kann es zu einem anderen (zukünftigen) MySQL-Setup kommen.
Pacerier
1
@ Pacerier ja, du bist richtig. Dies hängt von der aktuellen Funktionsweise von MySQL ab. So könnte es in Zukunft nicht mehr funktionieren. Angesichts der MySQL-Geschichte würde ich jedoch davon ausgehen, dass dies noch lange so funktioniert.
Cosimo
@cosimo, hoffentlich würden sie es dokumentieren, damit zuverlässiger Code diesen guten Hack tatsächlich nutzen kann. Code, der zuverlässig sein möchte, kann dies derzeit nicht verwenden.
Pacerier
13

So erhöhen Sie automatisch um eins, beginnend bei 10 in 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'

Dadurch wird die ID-Spalte ab 10 automatisch um eins erhöht.

Automatisches Inkrementieren in MySQL um 5 ab 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'

Dadurch wird die ID-Spalte jedes Mal automatisch um 5 erhöht, beginnend bei 10.

Eric Leschinski
quelle
5

Prozedur zum automatischen Fixieren des AUTO_INCREMENT-Werts der Tabelle

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
quelle
3

Wenn Sie dieses Verfahren für variable Feldnamen benötigen, kann dies idhilfreich sein:

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.
quelle
2

Sie können dies auch mit phpmyadmin tun. Wählen Sie einfach die Tabelle aus und gehen Sie zu den Aktionen. Ändern Sie die Optionen für das automatische Inkrement unter den Tabellen. Vergessen Sie nicht, auf Start zu klicken Automatisches Inkrementieren in phpmyadmin

Nordwind
quelle
-2

Exportieren Sie einfach die Tabelle mit Daten. Kopieren Sie dann die SQL-Datei

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 ;

Ändern Sie nun den Wert für das automatische Inkrementieren und führen Sie SQL aus.

user1911721
quelle