mySQL自动增量问题:键1的重复条目“4294967295”

时间:2010-03-30 19:18:05

标签: php mysql pdo auto-increment mysql-error-1062

我有一张电子邮件表。

自动增量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字段应该是一个很大的int,但我担心的是,这个东西会以某种方式跳回去。

约什

修改:更新

mysql版本5.0.45 red hat patched

因为我将id设置为BIGINT,所以最后几个id看起来像是:

3777
3778
3779
3780
4294967295
4294967296
4294967297
4294967298
4294967299
4294967300

正如您所看到的,它们是递增的,没有间隙(到目前为止)。非常奇怪。

7 个答案:

答案 0 :(得分:5)

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

如果其他人遇到此问题。首先检查字段大小。 :)

答案 1 :(得分:2)

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

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

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

长话短说,我保留原木的好事。

约什

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这实际上也发生在我身上(仍不确定为什么)。我做了一个预感:

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

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

答案 4 :(得分:0)

当您意外插入新记录并提供auto_increment值时,通常会发生这种情况。

大部分时间都是因为您有一个名称相似的列,并且您输入的拼写错误导致auto_increment值更新为您提供的值,如果您提供的是字符串而不是字符串,则为4294967295中间体

解决这个问题:

  • 删除PK值为4294967295的记录,
  • 运行
  • 检查最大增量值是多少
select max(autoincrementColumNameHere) from tableNameHere
  • 运行
  • 更新您的AUTO_INCREMENT值
 ALTER TABLE tableNameHere AUTO_INCREMENT = (maxValue+1)

答案 5 :(得分:-1)

只需将其更改为BIGINT即可创建“一些”额外的新记录。几千亿......;)

答案 6 :(得分:-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 like 9123456789 ) into a int`类型列。

但是,signed int的限制为2147483647

我尝试将其转换为unsigned,但仍然限制为4294967295。因此错误“4294967295”的东西,但是当我将其转换为bigint时,其限制为9223372036854775807(对于10位数的移动设备更多),它开始接受它。

为了移动设备,我没有将其转换为unsigned,将其限制增加到18446744073709551615