3

我只是想知道,是否有一种优雅的方法可以根据当前内容自动将 mysql 表的自动增量重置为最低值。

例子:

表:

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 位长整数的范围,这将阻止非常大的数字。

感谢您的任何建议!

4

2 回答 2

12

这取决于您的存储引擎,

对于 MySQL 5.6+ 上的 MyISAM 和 InnoDB,您可以将AUTO_INCREMENT表的值设置为1. 该值将自动增加到最大当前值 + 1。这样做。

ALTER TABLE table_name AUTO_INCREMENT = 1;

对于 MySQL < 5.6 上的 InnoDB,这将不起作用,您需要像这样手动执行此操作:

SELECT MAX(autoincrement_field) + 1 FROM table_name INTO @maxautoinc;
ALTER TABLE table_name AUTO_INCREMENT = @maxautoinc;

请注意,在最后一种情况下,两个查询需要使用相同的数据库连接运行。

于 2012-12-12T19:06:43.713 回答
1

重置自动增量 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');
于 2015-02-19T20:48:13.687 回答