mysql 无法从存储引擎读取自增值

Posted

技术标签:

【中文标题】mysql 无法从存储引擎读取自增值【英文标题】:mysql Failed to read auto-increment value from storage engine 【发布时间】:2011-11-12 21:36:11 【问题描述】:

我有一个 id 字段作为自动增量的 mysql 表。

当我向表中插入值时出现错误

1467 - 无法从存储引擎读取自增值

show table status 还告诉我,自动递增的字段有

18446744073709551615 作为 Auto_increment 值。

任何人都可以帮我解决什么问题......?

【问题讨论】:

发布您的表定义,让我们看看为哪个数据类型分配了字段 【参考方案1】:

我遇到了同样的错误,但在我的情况下,我的表中有大约 1.5k 条记录。 我通过像这样重置 AUTO INCREMEN 来修复它:

ALTER TABLE `table_name`  AUTO_INCREMENT = 1

【讨论】:

我在 phpmyadmin 上说“0”。我将其设置为 1 并在第一次插入时全部返回到实际值 为我工作。这个问题需要 Marco 的综合答案(当前已接受),因为解释和无穷大(这个答案)因为它是一个非常简单的解决方案。 对我不起作用。所以也许不是万能的灵丹妙药。 Shinbo 的解决方案对我有用:就像关闭并重新打开计算机一样。但我有点想知道是什么导致了这种问题......! 从未声称这是“终极”解决方案 :) 不过我很高兴你找到了答案。 危险的,非常危险的解决方案。【参考方案2】:

问题绝对可能是:将18446744073709551615转换为十六进制,你会发现$FFFF-FFFF-FFFF-FFFF。 如果您的字段是无符号 64 位,您将达到其限制。

【讨论】:

这是字段ID int(11) NOT NULL AUTO_INCREMENT,并且该表中只有200行,字段ID的最大值为200 @ash:导出你的数据库(或简单的表),删除现有表并创建一个新表;然后将数据导入回来注意不要触摸自动增量值... 实际上现在在删除表时遇到问题,因为字段 ID 用作外键我无法删除表。 @ash: 如果需要,请导出您的数据库并通过电子邮件发送给我...我会看看... @Marco 我有这个问题,我的系统是64位的,如果我安装一个64位的mysql,这个问题是否已经解决了?【参考方案3】:

几周前我在运行插入语句时开始收到此错误:

Duplicate entry '127' for key 'PRIMARY'

...即使我的表设置为自动递增。我进去并将 auto_increment 值从 127 更改为 128 然后我开始收到此错误:

1467 - Failed to read auto-increment value from storage engine

我最终发现该表最初是使用用于 ID 而非标准整数的 tinyint 列创建的......所以基本上它无法理解大于 127 的数字。我将列类型切换为正确的整数并解决了问题。

希望对某人有所帮助:)

【讨论】:

帮了我!我整天都在用头撞这个,这让我更加头痛。 这太完美了。确保检查数字的大小,因为 smallint 和 tinyint 的限制相对较小。 你是救世主。 与我遇到的错误序列完全相同。谢谢@Mike【参考方案4】:

就我而言,我犯了一个愚蠢的错误。我之前更改了我的表并将AUTO_INCREMENT 列的名称从ID 更改为id。因此,给定列名区分大小写,后续插入无法找到原始列。

【讨论】:

【参考方案5】:

实际上,您可以简单地更改列以删除其auto_increament 属性并再次将其设置为auto_increment。就我而言,这种方式确实有效。

【讨论】:

然后在插入记录时会出现重复键错误(假设该列是唯一的和/或主键)。干得好。 @tombom,我想你可能误解了他的解决方案,但它确实有效并且不会导致重复键错误。【参考方案6】:

我也犯了同样的错误。我只是更改表并增加我的自动增量字段的大小,然后运行以下查询 -

ALTER TABLE `table_name`  AUTO_INCREMENT = 6221;

其中 6221 是 Auto_increment 字段的最后一个值。

【讨论】:

【参考方案7】:

不到一个小时前,我第一次遇到此错误。在 PHP MyAdmin 中使用 SQL 语句重置 auto_increment 失败。在寻找解决方案后,我放下桌子并创建了一个替代品。错误仍然存​​在。仔细观察发现 auto_increment 设置为 0 即使我在创建字段时专门设置了 primary_key 和 auto_increment。再次使用 PHP MyAdmin 手动将 auto_increment 重置为 1,消除了错误。对我来说幸运的是,我只使用了一个包含几行测试数据的 3 列表。

【讨论】:

【参考方案8】:

我通过删除自动增量,保存表然后再次添加自动增量来修复它。

【讨论】:

【参考方案9】:

我今天也遇到了这个问题。我有一个包含超过 200 万行的表,并在发生此错误时尝试使用 LOAD DATA 添加另外 140K 行。我切换到 MyISAM 引擎,一切正常。

【讨论】:

【参考方案10】:

我遇到了同样的问题,解决方法是将列从 smallint(6) 更改为 int。

【讨论】:

【参考方案11】:

我遇到了问题,auto_increment 设置为 0,但显式设置 auto_increment 不起作用(保持为 0)。 我手动输入了一个带有 ID 的条目,在此之后,值设置正确。

【讨论】:

【参考方案12】:

我解决了这个问题,取消选中该字段的选项 AUTO_INCREMENT 并再次检查

【讨论】:

【参考方案13】:

我的解决方法是更改​​表并将其重命名为 orignal_backup 并保存,然后再次将其重命名为原始表,这个技巧对我有用。

【讨论】:

【参考方案14】:

很容易修复它。截断表格并再次上传数据,错误消失。

【讨论】:

【参考方案15】:

今天,当我尝试将记录插入到名为 mytablename 的表中时,我遇到了同样的错误:

ERROR 1467 (HY000): Failed to read auto-increment value from storage engine

在表中我只有 52269 条记录,max(id) = 52269。 我在 mysql 命令控制台下尝试了以下命令,但没有任何反应,错误仍然存​​在:

#
# set  AUTO_INCREMENT  = max(id) + 1: not work:
#
ALTER TABLE mytablename AUTO_INCREMENT = 52270;

我必须找到另一个解决方案。当我这样做时:

SHOW TABLE STATUS FROM mydatabase WHERE `name` LIKE 'mytablename' ;

说明我的Auto_Increment值为0,这明显是错误的,一定要大于等于1。

我修改了表格中的任何列,例如:

ALTER TABLE mytablename CHANGE COLUMN mycharfield mycharfield varchar(255) DEFAULT NULL AFTER id;

我再次执行 show table status 命令,

Auto_Increment 的值已经自动改成了 52270,这个值不错。

从那以后一切都过去了……

【讨论】:

【参考方案16】:

我遇到了同样的问题。

原因:我用主键和自动增量属性更改了我的表字段名称,因此自动增量停止工作并出现错误1467。

对我有用的是重置 phpmyadmin 中的主键,如下所示:

    转到表的“结构”选项卡,然后单击“indexex”,如图 1 所示。 现在编辑主键,如图 1 所示。 只需点击图 2 中的 Go。

Image 1

Image 2

它对我有用。

【讨论】:

请在您的帖子中嵌入图片。如果从外部托管中移动或删除外部资源的链接,它们可能很容易被破坏。【参考方案17】:

我发现该参数已启用。根据 DB-experts,它不应超过 '1'....

在我的例子中,它被设置为“4”,如下所示。

mysql> 选择@@innodb_force_recovery; +--------------+ | @@innodb_force_recovery | +--------------+ | 4 | +--------------+

因此,我确实在启动过程中没有传递参数就重新启动了mysql,

后来我能够插入或更新表格...希望它会帮助某人..

【讨论】:

你说的是什么参数?您是如何重新启动的?命令是什么?如何在启动期间启用/禁用参数?这个答案不清楚。【参考方案18】:

我也有同样的问题。我有一张包含数千条记录的表。我只是将字段的类型从 int 更改为 bigint

【讨论】:

以上是关于mysql 无法从存储引擎读取自增值的主要内容,如果未能解决你的问题,请参考以下文章

mysql中的存储引擎

02-msyql-存储引擎

mysql 自增值&自增锁

mysql innodb存储引擎和myisam引擎

MySQL 引擎

MySQL-InnoDB引擎