Cambia il numero iniziale dell'incremento automatico?


264

In MySQL, ho una tabella e voglio impostare il auto_incrementvalore su 5invece di 1. È possibile e quale istruzione di query fa questo?


non puoi CAMBIARE, solo aumentare
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 Se non esiste un valore superiore a quello che si desidera impostare la auto_incrementcolonna ed, è possibile anche ridurre il valore. ( documentazione mysql )
seyfahni

Risposte:


520

È possibile utilizzare ALTER TABLEper modificare il valore iniziale di auto_increment:

ALTER TABLE tbl AUTO_INCREMENT = 5;

Vedi il riferimento MySQL per maggiori dettagli.


6
Qualcuno sa se è possibile fare SENZA un ALTER?
thesmart

3
Si è possibile. Vedi la mia risposta
Cosimo,

3
MySQL 5.6 aveva un bug che non ti consentiva di ridurre il AUTO_INCREMENTvalore, ma è stato corretto in 5.6.16 e 5.7.4, vedi bugs.mysql.com/bug.php?id=69882
Daniel Vandersluis

3
Dai un'occhiata all'avvertimento di Cosimo sul tavolo da ricostruire se lo fai!
h00ligan,

15
Per chiarire: Impostando il valore iniziale su 5, significa che il prossimo inserto sarà 5.
Steen Schütt

97

Sì, puoi usare la ALTER TABLE t AUTO_INCREMENT = 42dichiarazione. Tuttavia, è necessario essere consapevoli del fatto che ciò causerà la ricostruzione dell'intera tabella, almeno con InnoDB e alcune versioni di MySQL. Se disponi di un set di dati già esistente con milioni di righe, il completamento potrebbe richiedere molto tempo .

Nella mia esperienza, è meglio fare quanto segue:

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

In questo modo, anche se si sta eseguendo il rollback della transazione, MySQL manterrà il valore di incremento automatico e la modifica verrà applicata immediatamente.

Puoi verificarlo emettendo una SHOW CREATE TABLE tdichiarazione. Tu dovresti vedere:

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

5
GRAZIE! SET foreign_key_checks = 0;è utile anche per questo.
dnozay,

Idea brillante! Nitpick: SHOW CREATE TABLE trestituirà effettivamente 43, ovvero il valore successivo dopo l'inserimento 42.
Petrkotek,

2
@cosimo, Aspetta, non è documentato ? Il manuale diceva che avrebbe dovuto funzionare in quel modo? Altrimenti potrebbe rompersi in una diversa (futura) configurazione mysql.
Pacerier,

1
@Pacerier sì, hai ragione. Questo si basa sul modo in cui MySQL funziona attualmente. Potrebbe non funzionare così in futuro. Data la storia di MySQL, suppongo che continuerà a funzionare in questo modo per molto tempo.
Cosimo,

@cosimo, Speriamo che lo documentino in modo che un codice affidabile possa effettivamente usare questo buon hack. A partire da ora, il codice che vuole essere affidabile non può usarlo.
Pacerier,

13

Come incrementare automaticamente di uno, a partire da 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'

Questo auto incrementa la colonna id di una a partire da 10.

Incremento automatico in MySQL di 5, a partire da 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'

Questo auto incrementa la colonna id di 5 ogni volta, a partire da 10.


5

Procedura per la correzione automatica del valore AUTO_INCREMENT della tabella

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

Se hai bisogno di questa procedura per nomi di campi variabili invece di idquesto potrebbe essere 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');

2

Puoi anche farlo usando phpmyadmin. Seleziona la tabella e vai alle azioni. E modifica l'incremento automatico sotto le opzioni della tabella. Non dimenticare di fare clic su Start Incremento automatico in phpmyadmin


-2

basta esportare la tabella con i dati .. quindi copiare il suo sql come

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 ;

ora cambia il valore di incremento automatico ed esegue sql.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.