更改自动递增起始号码?


263

在MySQL中,我有一个表,我想将auto_increment值设置51。这可能吗,这是什么查询语句?


您不能更改,只能增加
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. 如果没有比您要设置的auto_incremented列更高的值,则也可以减小该值。(mysql documentation
seyfahni

Answers:


519

您可以ALTER TABLE用来更改auto_increment初始值:

ALTER TABLE tbl AUTO_INCREMENT = 5;

有关更多详细信息,请参见MySQL参考


6
有人知道是否可以不做任何改变?
thesmart 2012年

3
是的,有可能。查看我的回复。
Cosimo 2012年

3
MySQL 5.6有一个不允许您降低该AUTO_INCREMENT值的错误,但已在5.6.16和5.7.4中修复,请参见bugs.mysql.com/bug.php?id=69882
Daniel

3
如果执行此操作,请查看cosimo关于正在重建表的警告!
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
petrkotek

2
@cosimo,等等,这是没有记录的吗?手册是否说过应该这样工作?如果没有,它可能会中断另一个(将来的)MySQL安装程序。
和平者

1
@Pacerier是的,您是正确的。这取决于MySQL当前的工作方式。将来可能无法正常工作。不过,考虑到MySQL的历史,我认为它将在很长一段时间内继续以这种方式工作。
2015年

@cosimo,希望他们能对其进行记录,以便可靠的代码可以实际使用这种出色的技巧。到目前为止,想要可靠的代码无法使用它。
和平者

13

如何在MySQL中从10开始自动递增1:

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.