1

我有一张电子邮件表。

自动增量 ID 的最后一条记录是 3780,这是一条合法记录。我现在插入的任何新记录都被插入到那里。

但是,在我的日志中,我偶尔会遇到:

Query FAIL: INSERT INTO mail.messages (timestamp_queue) VALUES (:time);
Array
(
    [0] => 23000
    [1] => 1062
    [2] => Duplicate entry '4294967295' for key 1
)

不知何故,自动增量跃升至 INT 最大值 4294967295

为什么在上帝的绿色地球上,它会跳得这么高?我没有带有 id 字段的插入。

该表的显示状态,Auto_increment 表现在显示为:4294967296

怎么会发生这样的事情?我意识到 id 字段可能应该是一个大整数,但我担心的是这个东西会以某种方式跳回来。

乔什

编辑:更新

mysql 版本 5.0.45 红帽补丁

由于我将 id 设置为 BIGINT,因此最后几个 id 看起来像:

3777
3778
3779
3780
4294967295
4294967296
4294967297
4294967298
4294967299
4294967300

如您所见,它们是增量的,没有间隙(到目前为止)。完全奇怪。

4

7 回答 7

5

我对完全相同的号码有同样的问题。我的问题是,int(10)当我将其更改为该字段时,bigint(20)它解决了我的问题。

如果其他人有这个问题。首先检查您的字段大小。:)

于 2012-08-08T07:29:40.083 回答
2

我仍然不完全清楚这里发生了什么,但我想我会跟进。

在我的持久性引擎中,我有一种类型的对象具有自动增量 id,以及一个具有 GUID id 的子类。

显然,两者是不相容的。我有理由将对象转换为其父对象,然后将其保存(基本上,子类是具有附加功能的电子邮件模板,但是当我想实际发送电子邮件时,我将其转换为父对象并将其保存到常规外发邮件队列)。愚蠢的是,我没有意识到 id 格式是不同的。这导致尝试将具有 36 个字符长的字符串的记录插入到 int 中。该字符串在准备好的语句中解析为“0”,无论出于何种原因,这都会导致自动增量系统 WIG OUT 并最大化原始表上的 INT 自动增量 id 字段。

长话短说,幸好我保留了日志。

乔什

于 2010-03-30T23:50:27.757 回答
1

This usually happens when you accidentally insert a new record a provide the auto_increment value.

Most of the time that's because you have a column with a similar name and you make a typo that leads to the auto_increment value updated with the one you provided, which is 4294967295 if you provided a string instead of an int.

To solve this:

  • delete the record whose PK value is 4294967295,
  • check what was the max increment value by running
select max(autoincrementColumNameHere) from tableNameHere
  • update your AUTO_INCREMENT value by running
 ALTER TABLE tableNameHere AUTO_INCREMENT = (maxValue+1)
于 2018-05-21T09:28:19.460 回答
0

这实际上也发生在我身上(仍然不确定为什么)。我有预感:

ALTER TABLE  `{table name here}` AUTO_INCREMENT = {your number here};
FLUSH TABLE `{table name here}`;

它似乎已经修复了它。首先,我尝试先设置自动增量值,但它又回到 4294967295。同样,不知道为什么更改增量值和刷新有效(我不是数据库专家),但我想我会在这里发布可以帮助别人。

于 2011-11-21T14:43:39.693 回答
0

通过 phpmyadmin,您可以使用该表的操作选项卡更改最后一个 id

于 2010-05-20T14:42:22.777 回答
-1

它也发生在我身上。这个问题很愚蠢。

如果它接收到character string它,它会转换它0,如果是integer, as in my case, where i was trying to insert a mobile no (in india it's 10 digits and starts with 9 like9123456789 ) into aint` 类型的列。

但是, 的极限signed int2147483647

我尝试将其转换为unsigned,但仍然是4294967295. 因此错误“4294967295”的东西,但是当我将它转换为bigint有限制的9223372036854775807(对于10位手机号码来说更多)时,它开始接受它。

为了移动,我将其转换为unsigned将其限制增加到18446744073709551615.

于 2012-10-30T20:17:58.907 回答
-1

只需将其更改为 BIGINT,您就可以创建“一些”额外的新记录。几千亿……;)

于 2010-03-30T19:21:42.140 回答