我只是想知道,如果有一种优雅的方法可以根据当前内容自动将mysql表的自动增量重置为最低值。
示例:
mytable的:
1 content of row 1
2 content of row 2
3 content of row 3
4 content of row 4
5 content of row 5
现在自动增量将为6
但在插入新内容之前,我删除了第3,4行和第5行。内容如下所示:
1 content of row 1
2 content of row 2
自动增量仍然是6。
这就是问题所在。
我希望自动增量为3,因为根据插入的ID,它是可能的最低值。
如果自动增量“无限增长”并超出12位长整数的范围,则会阻止非常大的数字。感谢任何建议!
答案 0 :(得分:11)
这取决于您的存储引擎,
对于MyisAM和MySQL 5.6+上的InnoDB,您可以将表的AUTO_INCREMENT
值设置为1
。该值将自动增加到最大当前值+ 1.这样做。
ALTER TABLE table_name AUTO_INCREMENT = 1;
对于MySQL上的InnoDB< 5.6,这不起作用,您需要手动执行此操作:
SELECT MAX(autoincrement_field) + 1 FROM table_name INTO @maxautoinc;
ALTER TABLE table_name AUTO_INCREMENT = @maxautoinc;
请注意,在最后一种情况下,需要使用相同的数据库连接运行这两个查询。
答案 1 :(得分:0)
重置自动增量ID。
http://community.spiceworks.com/scripts/show/3042-reset-auto-increment-ids
根据数据库中的当前值将数据库中的所有自动增量列更新为可能的最小值。我们需要在清理完数据库后执行此操作。
在存储过程中使用准备好的声明:
drop PROCEDURE if exists reset_autoincrement;
DELIMITER //
CREATE PROCEDURE reset_autoincrement (IN schemaName varchar(255))
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE o_name VARCHAR(255);
DECLARE o_table VARCHAR(255);
DECLARE cur1 CURSOR FOR SELECT COLUMN_NAME, TABLE_NAME FROM information_schema.`COLUMNS` WHERE extra LIKE '%auto_increment%' and table_schema=schemaName;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO o_name, o_table;
IF done THEN
LEAVE read_loop;
END IF;
set @qry1 = concat('SELECT MAX(`',o_name,'`) + 1 as autoincrement FROM `',o_table,'` INTO @ai');
PREPARE stmt1 FROM @qry1;
EXECUTE stmt1;
IF @ai IS NOT NULL THEN
SELECT o_name, o_table;
select @qry1;
select @ai;
set @qry2 = concat('ALTER TABLE `',o_table,'` AUTO_INCREMENT = ', @ai);
select @qry2;
PREPARE stmt2 FROM @qry2;
EXECUTE stmt2;
END IF;
END LOOP;
CLOSE cur1;
END //
DELIMITER ;
call reset_autoincrement('my_schema_name');