如何重置字段的AUTO_INCREMENT?我想让它再次从江户记下。
- 在dba.stackexchange.com网站上,DBA的响应可能会更好。
- 您可能也要清空表:TRUNCATE TABLE yourTableName;
- 可能重复mysql:reorder/reset auto increment主键?
- 是的,在这种情况下,截断表是最好的。它还将自动增量启动重置为1。
- 有时您没有权限截断,因为这需要删除权限。
- 这里有点necro,但是在使用innodb时,对于任何迟到的人,都不能截断具有父子外键关系的表。
- 先做DELETE tablename后做ALTER TABLE tablename AUTO_INCREMENT = 1比TRUNCATE tablename快。
- @哥萨克人SET foreign_key_checks = 0你可以
- 试试这个:DBCC CHECKIDENT('TableName', RESEED, 0)。
- 我想建议您的autoincrement值到底是什么并不重要。你不应该依赖他们的价值观,也不应该把任何意义放在他们身上。
您可以使用以下方法重置计数器:
对于innodb,不能将auto_increment值设置为低于或等于当前最高索引。(引自Viralpatel):
Note that you cannot reset the counter to a value less than or equal
to any that have already been used. For MyISAM, if the value is less
than or equal to the maximum value currently in the AUTO_INCREMENT
column, the value is reset to the current maximum plus one. For
InnoDB, if the value is less than the current maximum value in the
column, no error occurs and the current sequence value is not changed.
看看如何使用另一个表中的max值重置MySQL自动增量?关于如何动态获取可接受的值。
- 这对于一张填满的桌子来说可能永远都需要。注意:stackoverflow.com/questions/2681869/…
- 这是一个circular reference。
- 你说的curcular reference是什么意思?
- 当您重置自动增量时,我可以问引擎是否跳过一个ID(当已经有一行数据时)?
- DanfromGermany:在我的MySQL(5.5.29)上,如果你试图将其设置为小于最大值的值,它会将自动增量值提升到超过最大值的值。
- 请记住,MySQL将创建一个新表,具有相同的结构和新的自动增量值,并复制原始表中的所有记录,删除原始表并重命名新表。如果表很大,这可能会对生产环境产生相当大的性能影响(以及磁盘空间)。
- 如果您已经有了自动递增列,这个高度投票的答案真的有效吗?根据MySQL5.1文档:"您不能将计数器重置为小于或等于任何已经使用过的值。对于myisam,如果该值小于或等于"自动增量"列中当前的最大值,则该值将重置为当前的最大值加一。对于innodb,如果该值小于列中的当前最大值,则不会发生错误,并且不会更改当前序列值。"如果autoincrement大于1,则此处不会发生任何情况。
- 对于InnoDB,我认为最好的解决方案来自下面的@trust_字:将列更改为不具有自动增量,然后再次更改它以重新添加自动增量。
- 所以这必须手动完成?我将不得不添加一个mysql命令行命令,以便在每次重新部署应用程序时执行,因为手工为x表执行这一操作是荒谬的:/
- 实际上,ALTER TABLE tablename AUTO_INCREMENT = 0对我来说效果最好,否则新的记录将添加id=2。
- 是否有方法重置数据库中的所有表?
- 案例很重要。AUTO_INCREMENT需要全部大写。
- 使用truncate my_table删除表中的所有数据并将ai重置为1。
- 尽管在这里说了些什么,但是在innodb表上这样做对我来说很好,即使设置的值低于现有的最高ai值。也许这是在同一时间确定的?
- 我能知道你的答案和以前的答案有什么区别吗
- @praveensrinivas没有区别,我们同时添加了它们
- 就我个人而言,我认为这两个自动递增问题的答案有并发冲突是一件很美妙的事情:—)
- @马克戈德芬是的!
- 给弱者一票!!!!!
我想这就行了
- 这个问题已经有了适当的答案。此外,您的UPDATE将更新id列中的所有值。
- 测试工作100%lh4.googleusercontent.com/-8v6M wskdqs/u2zs7nvkiwi/aaaaaaaaa c‌&8203;mi/…
- OP没有声明它们正在重新排序现有的行。
- 完整而完美的答案。但我有一个疑问,当我们插入一个新值时,该值的pk是什么。是1还是下一个pk?
- 是的,这是最好的解决方案,但是如果有数据正在写入(例如生产表),您可能需要锁定表。
- 非常有帮助,我有相同的要求,我必须重置自动增量以1开始,只有前两个命令有帮助。
就像这样:
参考:http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
- reset表示将其设置为默认值…所以可以用1替换"value"
在"操作"选项卡下使用phpmyadmin有一种非常简单的方法,您可以在表选项中设置自动递增到所需的数字。
- 之后需要重新启动MySQL服务/服务器。
- 我认为在那之后您不需要重新启动服务器。phpadmin将只运行命令来更改增量起点。
- 这对InnoDB引擎不起作用
- 您不需要重新启动,它从下一次插入开始生效。
最适合我的解决方案是:
它很快,与InnoDB一起工作,我不需要知道当前的最大值!这样,自动递增计数器将重置,并从存在的最大值自动启动。
- 它将在信息模式上设置空的auto inc值;检查SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'my_table' AND table_schema = DATABASE( ) ;。
- 我在5.6.x版上进行了测试,这个测试非常有效,Kerem G&252;ne的查询结果呢?返回最大值加一,如前所述不为空。(可能第一次查询后设置为空,但第二次查询后设置为空)我认为这是InnoDB的最佳解决方案。
- 在InnoDB上很有用。-谢谢!
- 与set explicit value相同:"创建一个具有相同结构和新自动增量值的新表,并从原始表复制所有记录,删除原始表并重命名新表。如果表很大,这可能会对生产环境产生相当大的性能影响(以及磁盘空间)。"但更糟的是,需要两次完整复制表。
在如何重置mysql autoincrement列中提供了很好的选项
注意,ALTER TABLE tablename AUTO_INCREMENT = value;不适用于innodb
- 您如何使用InnoDB?
- 它在InnoDB上工作,至少在MySQL5.1.73上工作。
- 使用MySQLv5.6.2对我来说很好
- 我有一个类似的问题,在我从一个表中删除记录后,一个自动增量字段没有被重置。截断似乎起作用了。我认为下面的解决方案可以消除自动增量,然后重新应用可能有助于缓解这种情况。
对这个问题的最高评价的答案都建议"改变你的可移动的自动增量=值"。但是,只有当alter中的value大于autoincrement列的当前最大值时,这才有效。根据MySQL8文档:
You cannot reset the counter to a value less than or equal to the value that is currently in use. For both InnoDB and MyISAM, if the value is less than or equal to the maximum value currently in the AUTO_INCREMENT column, the value is reset to the current maximum AUTO_INCREMENT column value plus one.
本质上,您只能更改auto_increment来增加auto increment列的值,而不能像op在问题的第二部分中所问的那样将其重置为1。对于实际允许从当前最大值向下设置自动增量的选项,请查看重新排序/重置自动增量主键。
因为MySQL5.6中的功能发生了变化,所以添加了一个更新。从MySQL5.6开始,您可以在InnoDB中使用简单的alter表:
更新文档以反映这一点:
http://dev.mysql.com/doc/refman/5.6/en/alter-table.html
我的测试还显示表没有被复制,值只是被简单地更改了。
我在一些脚本中使用了这个方法,删除id字段,然后用以前的设置重新添加,数据库表中所有现有的字段都用新的自动增量值填充,这也适用于innodb。
请注意,表中的所有字段都将重新计数,并具有其他ID!!!!.
- 我想要这样的东西!但作为一个额外的警告,这显然会完全破坏你的外置钥匙。
您也可以这样使用语法TRUNCATE表:TRUNCATE TABLE table_name
当心!!TRUNCATE TABLE your_table将删除你的your_table中的所有内容!!
- 新程序员,请注意,TRUNCATE还将删除指定表中的所有行!
- 上面的注释应该插入到答案中,或者至少解释一下truncate的实际用法。
- TRUNCATE也会重置auto_increment字段吗?我的用例是清除表中的旧数据,并再次从1开始新数据的ID(假设,在测试完成后清除表以便正确使用)。我想我得把整张桌子和那张桌子再拿出来。
- 是的,truncate的工作方式类似于表上的重置。如果一个表在创建后被更改,那么这些更改将不会被重置,这并不完全正确。我认为它更接近于导出表结构和使用导出创建新表,而不是实际的重置。
用于空表:
如果您有数据,但希望整理,我建议使用:
这是我的解决方案,但是如果您的列有约束或者作为外键连接到其他表,我不建议这样做,因为这样做会产生不良影响,甚至无法工作。
>第一:删除列
>第二:重新创建列并将其设置为第一列,如果您希望它是我假定的第一列。
这很管用!
从MySQL5.6开始,由于在线DDL,下面的方法工作得更快(注:algorithm=inplace)
alter table tablename auto_increment=1, algorithm=inplace;
您可以简单地截断表以重置序列
表的自动递增计数器可以通过两种方式(重新)设置:
通过执行一个查询,就像其他人已经解释过的那样:
ALTER TABLE AUTO_INCREMENT=;
使用工作台或其他可视化数据库设计工具。我将在工作台上演示它是如何完成的——但在其他工具中也不应该有太大的不同。右键单击所需的表并从上下文菜单中选择Alter table。在底部,您可以看到更改表的所有可用选项。选择Options,您将得到以下表格:
然后,只需在字段Auto increment中设置所需的值,如图所示。这将基本上执行第一个选项中显示的查询。
我试图修改表,并将auto_increment设置为1,但它不起作用。我决定删除正在递增的列名,然后用您的首选名称创建一个新列,并将该新列设置为从一开始就递增。
- 你能解释一下你是怎么做到的吗?
- @Mzaragoza只需删除没有人工智能的旧列,然后创建一个启用了人工智能的新列。
- 你能更新你的答案来显示这个吗?我真的很感激
更新最新的一个ID
更改表tablename auto_increment=1
我在谷歌上搜索并找到了这个问题,但我真正想要的答案符合两个标准:
使用纯mysql查询
将现有表自动增量重置为max(id)+1
因为我在这里找不到我想要的确切答案,所以我从各种答案中拼凑出答案,并在这里分享。
需要注意的几点:
有问题的表是innodb
该表使用字段id,类型为int作为主键。
在MySQL中实现这一点的唯一方法是使用存储过程
我下面的图片使用Sequelpro作为图形用户界面。你应该能够根据你喜欢的mysql编辑器来调整它。
我在mysql ver 14.14 distrib 5.5.61上测试过这个版本,用于DebianLinuxGNU
步骤1:创建存储过程
创建这样的存储过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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查询。
1
| call reset_autoincrement ('products'); |
最初摘自https://simkimsia.com/library/sql queries/my sql reset autoinc中我自己的SQL查询注释,适用于stackoverflow
最好的方法是用ai删除字段,然后用ai再次添加,适用于所有表。
我建议您转到查询浏览器并执行以下操作:
转到Schemata并找到要更改的表。
右键单击并选择"复制创建语句"。
打开一个结果选项卡并将创建语句粘贴到它们的。
转到create语句的最后一行,查找auto_increment=n,(其中n是自动增量字段的当前数字。)
将n替换为1。
按ctrl+enter。
在表中输入新行后,自动增量应重置为1。
我不知道如果您试图添加一个已经存在自动递增字段值的行会发生什么。
希望这有帮助!