提问人:homerun 提问时间:1/19/2012 最后编辑:Peter Mortensenhomerun 更新时间:6/29/2023 访问量:1827983
如何在MySQL中重置AUTO_INCREMENT
How to reset AUTO_INCREMENT in MySQL
答:
您可以使用以下命令重置计数器:
ALTER TABLE tablename AUTO_INCREMENT = 1
InnoDB数据库
对于 InnoDB,您不能将该值设置为低于或等于最高当前索引。(引自 ViralPatel):auto_increment
请注意,不能将计数器重置为小于或等于的值 到任何已经使用过的。对于 MyISAM,如果该值较小 大于或等于AUTO_INCREMENT中当前的最大值 列中,该值将重置为当前最大值加 1。为 InnoDB,如果该值小于 列,则不会发生错误,并且当前序列值不会更改。
咏叹调
在具有 Aria 存储引擎的表中,auto_increment值可以设置为任何值,甚至低于当前最大值的值。但是,下一次插入将使用下一个可用值 (max + 1),忽略设置值。如果设置为更高的值,它将继续使用并从该值开始递增。文档对此不是特别清楚,但在 Mariadb 10.11.3 中观察到了这一点
另请参阅
请参阅如何使用另一个表中的 MAX 值重置 MySQL AutoIncrement? 了解如何动态获取可接受的值。
评论
circular reference
简单来说,就像这样:
ALTER TABLE tablename AUTO_INCREMENT = value;
评论
reset
表示将其设置为默认值...因此,您可以将“value”替换为 1
我建议你去查询浏览器并执行以下操作:
转到架构并找到要更改的表。
单击鼠标右键,然后选择 copy create statement。
打开结果选项卡并粘贴 create 语句。
转到 create 语句的最后一行,查找 Auto_Increment=N, (其中 N 是auto_increment字段的当前数字。
将 N 替换为 1。
按 Ctrl + Enter。
在表中输入新行后,Auto_increment应重置为 1。
我不知道如果您尝试添加已存在auto_increment字段值的行会发生什么。
这个问题评分最高的答案都推荐“改变你的可AUTO_INCREMENT=值”。但是,仅当 in the alter 大于 autoincrement 列的当前最大值时,这才有效。根据 MySQL 8 文档:value
不能将计数器重置为小于或等于当前正在使用的值的值。对于 InnoDB 和 MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则该值将重置为当前最大值AUTO_INCREMENT列值加 1。
从本质上讲,您只能更改 AUTO_INCREMENT 以增加自动增量列的值,而不能将其重置为 1,正如 OP 在问题的第二部分中提出的那样。对于实际允许您将AUTO_INCREMENT从当前最大值向下设置的选项,请查看重新排序/重置自动增量主键。
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!!.
在“操作”选项卡下,phpMyAdmin有一种非常简单的方法。在表格选项中,您可以将自动增量设置为所需的数字。
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
对我有用的最佳解决方案:
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,而且我不需要知道当前的最大值!
这边。自动增量计数器将重置,并将从存在的最大值自动启动。
评论
ID
小心! 将删除 .
TRUNCATE TABLE your_table
your_table
您还可以像这样使用语法表:TRUNCATE
TRUNCATE TABLE table_name
评论
TRUNCATE
AUTO_INCREMENT
我试图更改表格并将auto_increment设置为 1,但它不起作用。我决定删除我正在递增的列名,然后使用您喜欢的名称创建一个新列,并将该新列设置为从一开始就递增。
从 MySQL 5.6 开始,您可以将简单的 ALTER TABLE 与 InnoDB 一起使用:
ALTER TABLE tablename AUTO_INCREMENT = 1;
文档已更新以反映以下内容:
我的测试还表明该表未被复制。该值只是更改。
ALTER TABLE `table_name` DROP `id`;
ALTER TABLE `table_name` ADD `id` INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (`id`) ;
很快,首先我们删除了id列,然后再次添加了主键id...
评论
它适用于一个空表:
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`);
最好的方法是使用 AI 删除字段,然后使用 AI 再次添加。它适用于所有表。
评论
要更新到最新的加一个 ID,请执行以下操作:
ALTER TABLE table_name AUTO_INCREMENT =
(SELECT (id+1) id FROM table_name order by id desc limit 1);
编辑:
SET @latestId = SELECT MAX(id) FROM table_name;
SET @nextId = @latestId + 1;
ALTER TABLE table_name AUTO_INCREMENT = @nextId;
未测试,请在运行前进行测试*
评论
可以通过两种方式(重新)设置表的自动增量计数器:
通过执行查询,就像其他人已经解释过的那样:
ALTER TABLE <table_name> AUTO_INCREMENT=<table_id>;
使用 Workbench 或其他可视化数据库设计工具。我将在 Workbench 中展示它是如何完成的 - 但在其他工具中也应该没有太大区别。通过右键单击所需的表并从上下文菜单中进行选择。在底部,您可以看到用于更改表格的所有可用选项。选择,您将获得此表格:
Alter table
Options
然后只需在字段中设置所需的值,如图所示。这基本上将执行第一个选项中显示的查询。Auto increment
评论
ALTER TABLE tablename AUTO_INCREMENT = 1
评论
警告:如果您的列有约束或作为外键连接到其他表,这将产生不良影响。
首先,删除列:
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
我用谷歌搜索并找到了这个问题,但我真正在寻找的答案满足两个标准:
- 使用纯MySQL查询
- 将现有表自动增量重置为 max(id) + 1
由于我无法在这里找到我想要的确切内容,因此我从各种答案中拼凑出答案并在这里分享。
需要注意的几点:
- 有问题的表是 InnoDB
- 该表使用类型为 AS 的字段作为主键
id
int
- 纯粹在MySQL中执行此操作的唯一方法是使用存储过程
- 我下面的图像使用 SequelPro 作为 GUI。您应该能够根据您喜欢的MySQL编辑器进行调整
- 我已经在 MySQL Ver 14.14 Distrib 5.5.61 上测试过这一点,适用于 debian-linux-gnu
步骤 1:创建存储过程
创建如下所示的存储过程:
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 ;
然后运行它。
在运行之前,当您在数据库中的“存储过程”下查看时,它如下所示。
运行时,我只需选择存储过程,然后按“运行选择”
注意:分隔符部分至关重要。因此,如果您从此问题中选择的答案中复制并粘贴,则由于这个原因,它们往往不起作用。
运行后,我应该会看到存储过程
如果需要更改存储过程,则需要删除存储过程,然后选择再次运行。
步骤 2:调用存储过程
这一次,您可以简单地使用普通的MySQL查询。
call reset_autoincrement('products');
最初来自我自己的 SQL 查询笔记,https://simkimsia.com/reset-mysql-autoincrement-to-max-id-plus-1/ 并适用于 Stack Overflow。
从 MySQL 5.6 开始,由于在线 DDL,以下方法工作得更快(注意):algorithm=inplace
alter table tablename auto_increment=1, algorithm=inplace;
评论
尝试运行此查询:
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;
SET @num := 0;
UPDATE your_table SET id = @num := (@num+1);
ALTER TABLE your_table AUTO_INCREMENT =1;
评论
您需要遵循 Miles M 评论中的建议,这里有一些 PHP 代码可以修复 MySQL 中的范围。此外,您还需要打开 my.ini 文件 (MySQL) 并将 max_execution_time=60 更改为 max_execution_time=6000;适用于大型数据库。
不要使用“ALTER TABLE tablename 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);
评论
如果您正在使用,则必须在以下位置输入此内容:PHPStorm's database tool
database console
ALTER TABLE <table_name> AUTO_INCREMENT = 0;
评论
delete from url_rewrite where 1=1;
ALTER TABLE url_rewrite AUTO_INCREMENT = 1;
然后重新索引
上一个:使用 pip 安装特定包版本
评论
TRUNCATE TABLE yourTableName;
ALTER TABLE tablename AUTO_INCREMENT = value;
TRUNCATE TABLE