Изменить начальный номер автоинкремента?

264

В MySQL у меня есть таблица, и я хочу установить auto_incrementзначение 5вместо 1. Возможно ли это и какой оператор запроса это делает?

Джон Джонс
источник
Вы не можете изменить, только увеличить
Василий 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 Если нет более высокого значения, чем то, которое вы хотите установить в auto_incrementстолбце ed, вы также можете уменьшить это значение. ( документация MySQL )
Сейфани

Ответы:

520

Вы можете использовать ALTER TABLEдля изменения начального значения auto_increment:

ALTER TABLE tbl AUTO_INCREMENT = 5;

См. Ссылку MySQL для более подробной информации.

Даниэль Вандерслуис
источник
6
Кто-нибудь знает, можно ли это сделать БЕЗ АЛЬТЕР?
Смарт
3
Да, это возможно. Смотрите мой ответ.
Козимо
3
В MySQL 5.6 была ошибка, которая не позволяла вам уменьшить AUTO_INCREMENTзначение, но она была исправлена ​​в 5.6.16 и 5.7.4, см. Bugs.mysql.com/bug.php?id=69882
Даниэль Вандерслуис,
3
Посмотрите на предупреждение Козимо о восстановлении стола, если вы сделаете это!
h00ligan
15
Чтобы уточнить: установка начального значения на 5, означает, что следующая вставка будет 5.
Стин Шютт
97

Да, вы можете использовать ALTER TABLE t AUTO_INCREMENT = 42утверждение. Однако вы должны знать, что это приведет к перестройке всей таблицы, по крайней мере, с InnoDB и некоторыми версиями MySQL. Если у вас уже есть набор данных с миллионами строк, его выполнение может занять очень много времени .

По моему опыту, лучше сделать следующее:

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

Таким образом, даже если вы откатываете транзакцию, MySQL сохранит значение автоинкремента, и изменение будет применено немедленно.

Вы можете убедиться в этом, выпустив SHOW CREATE TABLE tзаявление. Тебе следует увидеть:

> SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
...
) ENGINE=InnoDB AUTO_INCREMENT=43 ...
Козимо
источник
5
СПАСИБО! SET foreign_key_checks = 0;также полезно для этого.
dnozay
Великолепная идея! Nitpick: SHOW CREATE TABLE tфактически вернет 43, то есть следующее значение после вставки 42.
Петркотек
2
@cosimo, подожди, разве это не документально ? В руководстве сказано, что так должно работать? Если нет, он может сломаться в другой (будущей) настройке mysql.
Pacerier
1
@Pacerier да, вы правы. Это зависит от того, как MySQL работает в настоящее время. В будущем это может не сработать. Однако, учитывая историю MySQL, я предполагаю, что она продолжит работать в течение длительного времени.
Козимо
@cosimo, Надеюсь, они документируют это, чтобы надежный код мог использовать этот хороший хак. На данный момент код, который хочет быть надежным, не может использовать это.
Pacerier
13

Как автоматически увеличить на единицу, начиная с 10 в 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'

Это автоматически увеличивает столбец id на единицу, начиная с 10.

Автоматическое увеличение MySQL на 5, начиная с 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'

Это автоматически увеличивает столбец id на 5 каждый раз, начиная с 10.

Эрик Лещинский
источник
5

Процедура автоматического исправления AUTO_INCREMENT значения таблицы

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

Если вам нужна эта процедура для имен переменных полей, idэто может быть полезно:

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

Вы также можете сделать это с помощью phpmyadmin. Просто выберите таблицу, чем перейти к действиям. И измените Авто приращение ниже опций таблицы. Не забудьте нажать на старт Авто приращение в phpmyadmin

Северный ветер
источник
-2

просто экспортируйте таблицу с данными .. затем скопируйте ее как SQL

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 ;

Теперь измените значение автоинкремента и выполните sql.

user1911721
источник