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


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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.