【问题标题】:Change auto increment starting number?更改自动递增起始编号?
【发布时间】:2010-11-01 12:27:33
【问题描述】:

在 MySQL 中,我有一个表,我想将 auto_increment 值设置为 5 而不是 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_incremented 列更高的值,您也可以减小该值。 (mysql documentation)

标签: mysql


【解决方案1】:

你可以使用ALTER TABLE来改变auto_increment的初始值:

ALTER TABLE tbl AUTO_INCREMENT = 5;

有关详细信息,请参阅MySQL reference。

【讨论】:

  • 有人知道是否可以在没有 ALTER 的情况下进行操作吗?
  • 是的,这是可能的。查看我的回复。
  • MySQL 5.6 有一个错误,不允许您减少 AUTO_INCREMENT 值,但它已在 5.6.16 和 5.7.4 中修复,请参阅 bugs.mysql.com/bug.php?id=69882
  • 看看 cosimo 的警告,如果你这样做,表将被重建!
  • 澄清一下:将初始值设置为5,意味着下一个插入将是5。
【解决方案2】:

是的,您可以使用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 ...

【讨论】:

  • 谢谢! SET foreign_key_checks = 0; 对此也很有用。
  • 好主意! Nitpick:SHOW CREATE TABLE t 实际上会返回43,即插入42 后的下一个值。
  • @cosimo,等等,这不是无证吗?手册是否说它应该那样工作?如果不是,它可能会在不同的(未来)mysql 设置中中断。
  • @Pacerier 是的,你是对的。这取决于 MySQL 当前的工作方式。将来可能不会那样工作。不过,鉴于 MySQL 的历史,我认为它会在很长一段时间内继续以这种方式工作。
  • @cosimo,希望他们将其记录下来,以便可靠的代码实际上可以使用这个好的 hack。到目前为止,想要可靠的代码不能使用它。
【解决方案3】:

只需导出带有数据的表.. 然后像复制它的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。

【讨论】:

    【解决方案4】:

    如何自动加一,在 MySQL 中从 10 开始:

    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')
      

      【讨论】:

        【解决方案6】:

        如果您需要此过程用于变量字段名而不是 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');
        

        【讨论】:

          【解决方案7】:

          您也可以使用 phpmyadmin 来完成。只需选择表格即可执行操作。并更改下表选项中的自动增量。不要忘记点击开始

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-09-03
            • 1970-01-01
            • 2012-06-17
            • 1970-01-01
            • 1970-01-01
            • 2014-07-20
            • 2016-07-26
            相关资源
            最近更新 更多