Mysql 更改自动递增起始编号?

Mysql 更改自动递增起始编号?,mysql,Mysql,在MySQL中,我有一个表,我想将auto_increment值设置为5,而不是1。这是可能的吗?什么查询语句可以做到这一点?您可以使用ALTER TABLE更改自动增量初始值: ALTER TABLE tbl AUTO_INCREMENT = 5; 有关更多详细信息,请参阅。是的,您可以使用ALTER TABLE t AUTO_INCREMENT=42语句。但是,您需要知道,这将导致重建整个表,至少在InnoDB和某些MySQL版本中是这样如果已有一个包含数百万行的数据集,则可能需要很长时间

在MySQL中,我有一个表,我想将
auto_increment
值设置为
5
,而不是
1
。这是可能的吗?什么查询语句可以做到这一点?

您可以使用
ALTER TABLE
更改自动增量初始值:

ALTER TABLE tbl AUTO_INCREMENT = 5;

有关更多详细信息,请参阅。

是的,您可以使用
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也将保留自动增量值,并且更改将立即应用

您可以通过发出
showcreatetablett
语句来验证这一点。你应该看到:

> SHOW CREATE TABLE t \G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
...
) ENGINE=InnoDB AUTO_INCREMENT=43 ...

只需导出包含数据的表。。 然后像复制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。

如何自动递增1,在MySQL中从10开始: 这会自动将id列从10开始递增1

在MySQL中自动增加5,从10开始:
从10开始,每次自动将id列增加5。

自动修复表的自动增量值的过程

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

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

您也可以使用phpmyadmin来完成。只需选择表,然后转到操作。并更改下表中的自动增量选项。别忘了点击开始

有人知道不使用涂改是否可行吗?是的,有可能。请参阅我的回复。MySQL 5.6有一个错误,它不允许您减少
自动增量
值,但在5.6.16和5.7.4中已修复,请参阅查看cosimo关于正在重建表的警告,如果您这样做!澄清:将初始值设置为5,意味着下一次插入将为5。谢谢<代码>设置外键检查=0也很有用。好主意!挑剔:
SHOW CREATE TABLE t
将实际返回
43
,即插入
42
后的下一个值@cosimo,等等,这不是未记录的吗?手册上有没有说应该这样做?如果不是,它可能会在另一个(未来)mysql设置中中断。@Pacerier是的,您是正确的。这取决于MySQL目前的工作方式。将来可能不会这样。考虑到MySQL的历史,我认为它将继续以这种方式工作很长一段时间。@cosimo,希望他们能够记录它,以便可靠的代码能够实际使用这种好的黑客。到目前为止,想要可靠的代码不能使用这个。你不能更改,只有increase@VasiliiSuricov
您可以使用ALTER TABLE更改此选项,但在这种情况下,新值必须高于“自动增量”列中的最高值。
如果没有比您要设置的“自动增量”列更高的值,您也可以减小该值。()
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')
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');