Змінити початковий номер автоматичного збільшення?


264

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


ви не можете змінити, лише збільшити
Василь Суріцов

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
Хтось знає, чи можна зробити БЕЗ АЛЬТЕРА?
thesmart

3
Так, це можливо. Дивіться мою відповідь.
Cosimo

3
У MySQL 5.6 була помилка, яка не дозволила вам зменшити AUTO_INCREMENTзначення, але вона була виправлена ​​в 5.6.16 та 5.7.4, див. Bugs.mysql.com/bug.php?id=69882
Daniel Vandersluis

3
Погляньте на попередження cosimo про перебудову таблиці, якщо ви це зробите!
h00ligan

15
Для уточнення: Якщо встановити початкове значення 5, означає, що наступна вставка буде 5.
Steen Schütt

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.
petrkotek

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.