Mysql 更改自动递增起始编号?
在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版本中是这样如果已有一个包含数百万行的数据集,则可能需要很长时间
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');