如何在 MySQL 中重置 AUTO_INCREMENT
Posted
技术标签:
【中文标题】如何在 MySQL 中重置 AUTO_INCREMENT【英文标题】:How to reset AUTO_INCREMENT in MySQL 【发布时间】:2014-04-02 13:58:23 【问题描述】:我如何重置字段的AUTO_INCREMENT
?
我希望它再次从1
开始计数。
【问题讨论】:
您可能会在dba.stackexchange.comdba.stackexchange.com的 DBA 网站上获得更好的回复 你可能也想清空表格:TRUNCATE TABLE yourTableName;
mysql: Reorder/Reset auto increment primary key?的可能重复
是的,在这种情况下截断表是最好的。它还将自动增量开始重置为 1。
有时您没有 TRUNCATE 的权限,因为这需要 DROP 权限。
【参考方案1】:
要更新到最新的加一id:
ALTER TABLE table_name AUTO_INCREMENT =
(SELECT (id+1) id FROM table_name order by id desc limit 1);
编辑:
SET @latestId = SELECT id FROM table_name order by id desc limit 1;
SET @latestIdPlusOne = @latestId + 1;
ALTER TABLE table_name AUTO_INCREMENT = @latestIdPlusOne;
未测试,请在运行前测试*
【讨论】:
这有点令人困惑。能改一下吗?【参考方案2】:我用谷歌搜索并找到了这个问题,但我真正想要的答案满足两个标准:
-
使用纯 MySQL 查询
将现有表的自动增量重置为 max(id) + 1
由于我在这里找不到我想要的确切答案,所以我从各种答案中拼凑出答案并在这里分享。
注意事项:
-
有问题的表是 InnoDB
该表使用类型为
int
的字段id
作为主键
纯粹在 MySQL 中执行此操作的唯一方法是使用存储过程
我下面的图片使用 SequelPro 作为 GUI。您应该能够根据您喜欢的 MySQL 编辑器对其进行调整
我已经在 MySQL Ver 14.14 Distrib 5.5.61 上测试过,适用于 debian-linux-gnu
第一步:创建存储过程
创建一个这样的存储过程:
DELIMITER //
CREATE PROCEDURE reset_autoincrement(IN tablename varchar(200))
BEGIN
SET @get_next_inc = CONCAT('SELECT @next_inc := max(id) + 1 FROM ',tablename,';');
PREPARE stmt FROM @get_next_inc;
EXECUTE stmt;
SELECT @next_inc AS result;
DEALLOCATE PREPARE stmt;
set @alter_statement = concat('ALTER TABLE ', tablename, ' AUTO_INCREMENT = ', @next_inc, ';');
PREPARE stmt FROM @alter_statement;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END //
DELIMITER ;
然后运行它。
在运行之前,当您查看数据库中的存储过程时,它看起来像这样。
当我运行时,我只需选择存储过程并按运行选择
注意:分隔符部分至关重要。因此,如果您复制并粘贴此问题中最热门的答案,它们往往不会因此而起作用。
运行后,应该会看到存储过程
如果需要更改存储过程,需要删除存储过程,然后选择重新运行。
第二步:调用存储过程
这一次您可以简单地使用普通的 MySQL 查询。
call reset_autoincrement('products');
最初来自我自己在 https://simkimsia.com/reset-mysql-autoincrement-to-max-id-plus-1/ 中的 SQL 查询注释,并适用于 ***。
【讨论】:
链接已损坏:“未找到。在此服务器上未找到请求的资源。” 谢谢你,@PeterMortensen。我已经修复了断开的链接。【参考方案3】:您需要遵循 Miles M 评论中的建议,这里有一些 php 代码可以修复 MySQL 中的范围。您还需要打开 my.ini 文件 (MySQL) 并将 max_execution_time=60 更改为 max_execution_time=6000;对于大型数据库。
不要使用“ALTER TABLE 表名 AUTO_INCREMENT = 1”。它将删除数据库中的所有内容。
$con = mysqli_connect($dbhost, $dbuser, $dbpass, $database);
$res = mysqli_query($con, "select * FROM data WHERE id LIKE id ORDER BY id ASC");
$count = 0;
while ($row = mysqli_fetch_array($res))
$count++;
mysqli_query($con, "UPDATE data SET id='".$count."' WHERE id='".$row['id']."'");
echo 'Done reseting id';
mysqli_close($con);
【讨论】:
回复“Miles M 的评论”:你的意思是Miles M's answer?【参考方案4】:尝试运行此查询:
ALTER TABLE tablename AUTO_INCREMENT = value;
或者试试这个查询重置自动增量
ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL;
并设置自动增量,然后运行此查询:
ALTER TABLE `tablename` CHANGE `id` `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
【讨论】:
【参考方案5】:这是我的解决方案,但如果您的列有约束或作为外键连接到其他表,我不建议这样做,因为它会产生不良影响甚至不起作用。
首先:删除列
ALTER TABLE tbl_name DROP COLUMN column_id
第二:重新创建列并将其设置为 FIRST,如果您希望它作为我假设的第一列。
ALTER TABLE tbl_access ADD COLUMN `access_id` int(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST
这很好用!
【讨论】:
【参考方案6】:可以通过两种方式(重新)设置表的自动增量计数器:
通过执行查询,就像其他人已经解释的那样:
ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;
使用Workbench 或其他可视化数据库设计工具。我将在 Workbench 中展示它是如何完成的——但在其他工具中也不应该有太大的不同。通过右键单击所需的表并从上下文菜单中选择 Alter table
。在底部,您可以看到更改表格的所有可用选项。选择Options
,你会得到这个表格:
然后只需在字段Auto increment
中设置所需的值,如图所示。这将基本上执行第一个选项中显示的查询。
【讨论】:
【参考方案7】:您可以简单地截断表格以重置序列:
TRUNCATE TABLE TABLE_NAME
【讨论】:
【参考方案8】:最好的方法是用 AI 删除字段,然后用 AI 重新添加。它适用于所有表格。
【讨论】:
什么是“人工智能”? Artificial intelligence?还是别的什么?【参考方案9】:这是一个空表:
ALTER TABLE `table_name` AUTO_INCREMENT = 1;
如果你有数据,但又想整理一下,我推荐使用这个:
ALTER TABLE `table_name` DROP `auto_colmn`;
ALTER TABLE `table_name` ADD `auto_colmn` INT( many you want ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (`auto_colmn`);
【讨论】:
【参考方案10】:从 MySQL 5.6 开始,您可以在 InnoDB 中使用简单的 ALTER TABLE:
ALTER TABLE tablename AUTO_INCREMENT = 1;
文档已更新以反映这一点:
13.1.7 ALTER TABLE Statement
我的测试还表明该表没有被复制。值只是简单地改变了。
【讨论】:
【参考方案11】:你也可以像这样使用TRUNCATE
表的语法:
TRUNCATE TABLE table_name
小心!TRUNCATE TABLE your_table
将删除您的your_table
中的所有内容。
【讨论】:
新程序员,请注意TRUNCATE
还会删除指定表中的所有行!
为什么要全部删除?【参考方案12】:
最适合我的解决方案:
ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED;
COMMIT;
ALTER TABLE my_table MODIFY COLUMN ID INT(10) UNSIGNED AUTO_INCREMENT;
COMMIT;
速度很快,与 InnoDB 配合使用,我不需要知道当前的最大值!
这边。自动递增计数器将重置并从存在的最大值自动开始。
【讨论】:
【参考方案13】:在“操作”选项卡下使用phpMyAdmin 有一个非常简单的方法。在表格选项中,您可以将自动增量设置为您想要的数字。
【讨论】:
【参考方案14】:ALTER TABLE news_feed DROP id
ALTER TABLE news_feed ADD id BIGINT( 200 ) NOT NULL AUTO_INCREMENT FIRST ,ADD PRIMARY KEY (id)
我在一些脚本中使用了它。 id 字段被删除,然后使用以前的设置添加回来。数据库表中的所有现有字段都用新的自动增量值填充。这也适用于InnoDB。
请注意,表中的所有字段都将被重新计算,并且会有其他 id!!!。
【讨论】:
【参考方案15】:我建议你去Query Browser并执行以下操作:
转到架构并找到要更改的表。
右键单击并选择复制创建语句。
打开一个结果选项卡并粘贴创建语句。
转到 create 语句的最后一行并查找 Auto_Increment=N, (其中 N 是 auto_increment 字段的当前编号。)
将 N 替换为 1。
按 Ctrl + Enter。
Auto_increment 在表格中输入新行后应重置为 1。
我不知道如果您尝试添加一个 auto_increment 字段 值已经存在的行会发生什么。
【讨论】:
【参考方案16】:就像这样:
ALTER TABLE tablename AUTO_INCREMENT = value;
参考:13.1.9 ALTER TABLE Statement
【讨论】:
reset
表示将其设置为默认值...因此您可以将“value”替换为1【参考方案17】:
您可以通过以下方式重置计数器:
ALTER TABLE tablename AUTO_INCREMENT = 1
对于InnoDB,您不能将auto_increment
值设置为低于或等于当前最高索引。 (引自ViralPatel):
请注意,您不能将计数器重置为小于或等于的值 任何已经使用过的。对于 MyISAM,如果值小于 大于或等于当前在 AUTO_INCREMENT 中的最大值 列,值被重置为当前最大值加一。为了 InnoDB,如果该值小于当前的最大值 列,不发生错误,当前序列值不变。
请参阅How can I reset an MySQL AutoIncrement using a MAX value from another table?,了解如何动态获取可接受的值。
【讨论】:
这可能需要很长时间才能填满一张桌子。请注意:***.com/questions/2681869/… 这是circular reference
请记住,MySql 将创建一个具有相同结构和新 auto_increment 值的新表,并从原始表中复制所有记录,删除原始表并重命名新表。如果表很大,这可能会对生产环境产生相当大的性能影响(和磁盘空间)。
@Rostol 即使在今天(2021 年 MySQL 8+)也存在这个问题吗?我看到即使是大型表,重置 AUTO_INCREMENT 也是即时的。我有点需要重置功能,因为我有 ON DUPLICATE KEY UPDATE 查询,每次运行时都会不必要地增加计数器。【参考方案18】:
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
【讨论】:
解释一下。例如,想法/要点是什么?它与其他答案有何不同?请通过editing (changing) your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。 @num 应该是桌子上的最后一个 ID 号。它将在此基础上加 1,并将插入时的下一个 Id 编号设置为此 @Num+1。然后 auto_increment 将设置为每次插入时将下一个 ID 加 1。注意 t:= 和 = 做同样的事情。【参考方案19】:此问题评分最高的答案都推荐“ALTER yourtable AUTO_INCREMENT= value”。但是,这仅在更改中的value
大于自动增量列的当前最大值时才有效。 According to the MySQL 8 documentation:
您不能将计数器重置为小于或等于当前使用的值。对于 InnoDB 和 MyISAM,如果该值小于或等于当前 AUTO_INCREMENT 列中的最大值,则将该值重置为当前最大 AUTO_INCREMENT 列值加一。
本质上,您只能更改 AUTO_INCREMENT 以增加自动增量列的值,而不是将其重置为 1,正如 OP 在问题的第二部分中所问的那样。对于实际上允许您从当前最大值向下设置 AUTO_INCREMENT 的选项,请查看 Reorder / reset auto increment primary key。
【讨论】:
【参考方案20】:从 MySQL 5.6 开始,由于online DDL(注意algorithm=inplace
),以下方法运行得更快:
alter table tablename auto_increment=1, algorithm=inplace;
【讨论】:
DDL = data definition language?【参考方案21】:ALTER TABLE 表名 AUTO_INCREMENT = 1
【讨论】:
解释一下。【参考方案22】:我尝试更改表并将 auto_increment 设置为 1,但它不起作用。我决定删除我正在递增的列名,然后使用您的首选名称创建一个新列,并将该新列设置为从一开始就递增。
【讨论】:
【参考方案23】:SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
我觉得这样就可以了
【讨论】:
会做到吗?七年应该够了。【参考方案24】:How To Reset MySQL Autoincrement Column中给出了不错的选择
请注意,ALTER TABLE tablename AUTO_INCREMENT = value;
不适用于 InnoDB
【讨论】:
链接仍然有效,但也许在这里总结一下?以上是关于如何在 MySQL 中重置 AUTO_INCREMENT的主要内容,如果未能解决你的问题,请参考以下文章