Zmienić numer początkowy automatycznego przyrostu?

264

W MySQL mam tabelę i chcę ustawić auto_incrementwartość na 5zamiast 1. Czy to możliwe i jakie to zapytanie zapytania?

John Jones
źródło
nie możesz ZMIENIĆ, tylko zwiększyć
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. źródło Jeśli nie ma wyższej wartości niż to, co chcesz ustawić auto_incrementkolumnę ed, możesz również zmniejszyć wartość. ( dokumentacja mysql )
seyfahni

Odpowiedzi:

520

Możesz użyć ALTER TABLEdo zmiany początkowej wartości auto_increment:

ALTER TABLE tbl AUTO_INCREMENT = 5;

Więcej informacji znajduje się w dokumentacji MySQL .

Daniel Vandersluis
źródło
6
Czy ktoś wie, czy można to zrobić BEZ ZMIANY?
thesmart
3
Tak, to możliwe. Zobacz moją odpowiedź.
Cosimo,
3
W MySQL 5.6 występował błąd, który nie pozwalał na zmniejszenie AUTO_INCREMENTwartości, ale został on naprawiony w 5.6.16 i 5.7.4, patrz bugs.mysql.com/bug.php?id=69882
Daniel Vandersluis
3
Spójrz na ostrzeżenie cosimo o przebudowywaniu stołu, jeśli to zrobisz!
h00ligan,
15
Wyjaśnienie: Ustawienie wartości początkowej na 5 oznacza, że ​​następna wstawka będzie miała wartość 5.
Steen Schütt
97

Tak, możesz użyć ALTER TABLE t AUTO_INCREMENT = 42oświadczenia. Należy jednak pamiętać, że spowoduje to przebudowę całej tabeli, przynajmniej w przypadku InnoDB i niektórych wersji MySQL. Jeśli masz już zbiór danych z milionami wierszy, jego ukończenie może zająć bardzo dużo czasu .

Z mojego doświadczenia wynika, że ​​lepiej wykonać następujące czynności:

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

W ten sposób, nawet jeśli wycofujesz transakcję, MySQL zachowa wartość automatycznego przyrostu, a zmiana zostanie zastosowana natychmiast.

Możesz to zweryfikować, wydając SHOW CREATE TABLE toświadczenie. Powinieneś zobaczyć:

> SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
...
) ENGINE=InnoDB AUTO_INCREMENT=43 ...
Cosimo
źródło
5
DZIĘKI! SET foreign_key_checks = 0;jest również przydatny do tego.
dnozay
Genialny pomysł! Nitpick: SHOW CREATE TABLE tfaktycznie powróci 43, tj. Następna wartość po wstawieniu 42.
petrkotek
2
@cosimo, czekaj, nie jest to nieudokumentowane ? Czy instrukcja mówi, że tak powinno działać? Jeśli nie, może się zepsuć w innej (przyszłej) konfiguracji mysql.
Pacerier
1
@Pacerier tak, masz rację. Zależy to od sposobu, w jaki obecnie działa MySQL. W przyszłości może tak nie działać. Biorąc pod uwagę historię MySQL, zakładam, że tak będzie działać przez długi czas.
Cosimo,
@cosimo, mam nadzieję, że udokumentują to, aby niezawodny kod mógł faktycznie wykorzystać ten dobry hack. Na razie kod, który chce być niezawodny, nie może tego używać.
Pacerier
13

Jak automatycznie zwiększać o jeden, zaczynając od 10 w 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'

To auto zwiększa kolumnę id o jedną, zaczynając od 10.

Automatyczny przyrost w MySQL o 5, zaczynając od 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'

To auto zwiększa kolumnę id o 5 za każdym razem, zaczynając od 10.

Eric Leschinski
źródło
5

Procedura automatycznej naprawy wartości AUTO_INCREMENT tabeli

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')
Żytko Włodzimierz
źródło
3

Jeśli potrzebujesz tej procedury dla zmiennych nazw pól zamiast idtego, może to być pomocne:

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.
źródło
2

Możesz to również zrobić za pomocą phpmyadmin. Po prostu wybierz tabelę i przejdź do akcji. I zmień Auto-przyrost poniżej opcji tabeli. Nie zapomnij kliknąć Start Auto przyrost w phpmyadmin

Północny wiatr
źródło
-2

po prostu wyeksportuj tabelę z danymi .., a następnie skopiuj jej sql jak

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 ;

teraz zmień wartość automatycznego przyrostu i uruchom sql.

użytkownik1911721
źródło