Changer le numéro de départ de l'incrémentation automatique?

264

Dans MySQL, j'ai une table et je veux définir la auto_incrementvaleur à la 5place de 1. Est-ce possible et quelle instruction de requête fait-elle?

John Jones
la source
vous ne pouvez pas CHANGER, seulement augmenter
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 S'il n'y a pas de valeur supérieure à ce que vous souhaitez définir votre auto_incrementcolonne ed, vous pouvez également diminuer la valeur. ( documentation mysql )
seyfahni

Réponses:

520

Vous pouvez utiliser ALTER TABLEpour modifier la valeur initiale auto_increment:

ALTER TABLE tbl AUTO_INCREMENT = 5;

Voir la référence MySQL pour plus de détails.

Daniel Vandersluis
la source
6
Quelqu'un sait s'il est possible de faire SANS ALTER?
thesmart
3
Oui c'est possible. Voir ma réponse.
Cosimo
3
MySQL 5.6 avait un bug qui ne vous permettait pas de diminuer la AUTO_INCREMENTvaleur, mais il a été corrigé dans 5.6.16 et 5.7.4, voir bugs.mysql.com/bug.php?id=69882
Daniel Vandersluis
3
Jetez un œil à l'avertissement de cosimo concernant la table en cours de reconstruction si vous faites cela!
h00ligan
15
Pour clarifier: la définition de la valeur initiale à 5 signifie que la prochaine insertion sera 5.
Steen Schütt
97

Oui, vous pouvez utiliser la ALTER TABLE t AUTO_INCREMENT = 42déclaration. Cependant, vous devez être conscient que cela entraînera la reconstruction de votre table entière, au moins avec InnoDB et certaines versions de MySQL. Si vous avez un ensemble de données déjà existant avec des millions de lignes, cela peut prendre beaucoup de temps .

D'après mon expérience, il vaut mieux faire ce qui suit:

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

De cette façon, même si vous annulez la transaction, MySQL conservera la valeur d'incrémentation automatique et la modification sera appliquée instantanément.

Vous pouvez le vérifier en émettant une SHOW CREATE TABLE tdéclaration. Tu devrais voir:

> SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
...
) ENGINE=InnoDB AUTO_INCREMENT=43 ...
Cosimo
la source
5
MERCI! SET foreign_key_checks = 0;est également utile pour cela.
dnozay
Idée brillante! Nitpick: SHOW CREATE TABLE tretournera réellement 43, c'est-à-dire la valeur suivante après l'insertion 42.
petrkotek
2
@ cosimo, Attendez, n'est-ce pas sans papiers ? Le manuel a-t-il dit qu'il devrait fonctionner de cette façon? Sinon, cela peut casser dans une configuration mysql (future) différente.
Pacerier
1
@Pacerier oui, vous avez raison. Cela dépend de la façon dont MySQL fonctionne actuellement. Cela pourrait ne pas fonctionner comme ça à l'avenir. Compte tenu de l'historique de MySQL, je suppose qu'il continuera de fonctionner de cette façon pendant longtemps.
Cosimo
@cosimo, j'espère qu'ils le documenteront afin qu'un code fiable puisse réellement utiliser ce bon hack. Pour l'instant, le code qui veut être fiable ne peut pas l'utiliser.
Pacerier
13

Comment incrémenter automatiquement d'un, à partir de 10 dans 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'

Cette auto incrémente la colonne id d'une unité à partir de 10.

Incrémentation automatique dans MySQL de 5, à partir de 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'

Cette incrémentation automatique de la colonne id de 5 à chaque fois, à partir de 10.

Eric Leschinski
la source
5

Procédure de correction automatique de la valeur AUTO_INCREMENT de la table

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
la source
3

Si vous avez besoin de cette procédure pour les noms de champs variables au lieu de idcela, cela pourrait être utile:

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.
la source
2

Vous pouvez également le faire en utilisant phpmyadmin. Sélectionnez simplement le tableau et passez aux actions. Et modifiez l'incrémentation automatique sous les options du tableau. N'oubliez pas de cliquer sur démarrer Incrémentation automatique en phpmyadmin

Vent du nord
la source
-2

il suffit d'exporter la table avec des données .. puis de copier son sql comme

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 ;

maintenant changez la valeur d'incrémentation automatique et exécutez sql.

user1911721
la source