【问题标题】:mySQL auto increment problem: Duplicate entry '4294967295' for key 1mySQL 自动增量问题:键 1 的重复条目 '4294967295'
【发布时间】:2010-03-30 19:18:05
【问题描述】:

我有一个电子邮件表格。

自动增量 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

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

【问题讨论】:

  • :time 插入什么样的字段? id 为 4294967296 的行的值是否包含任何线索?
  • 什么版本的mysql?您是否阅读过 Google 提供的“关于键 1 的重复条目 '4294967295' 的大约 3,020 个”结果?您是否检查过当前 id 中是否有任何空白?您是否检查过是否真的有 id 为 4294967295 的记录?您确定您的代码没有对此字段进行显式插入/更新以将其设置为-1吗? “最后的记录”是什么意思?最近的?最大身份证?您可以读回当前的插入 ID(我可以在 PMA 中看到),尽管我不知道如何检查它。 C.
  • 有一个 ID 为 42xxx 的记录,虽然我不知道它是如何到达那里的,对吧。它的书面 7k 记录超过 3 个月,并且它刚刚呈现。我使用 INSERT ON DUPLICATE KEY UPDATE,它很久以前就有一个涉及自动增量的错误,但它没有跟踪,因为除了一个超级大的之外,id 中没有间隙。
  • timestamp_sent 是一个 INT(10) 值中没有线索。它们都是完整的。我总是使用prepared statements,所以我不担心sql注入。嗯。
  • 我想知道字段长度覆盖是否会导致这样的事情。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    乔什

    【讨论】:

      【解决方案3】:

      这通常发生在您不小心插入一条新记录并提供 auto_increment 值时。

      大多数情况下,这是因为您有一个名称相似的列,并且您输入了一个拼写错误,导致 auto_increment 值更新为您提供的值,如果您提供的是字符串而不是 int,则该值是 4294967295。

      解决这个问题:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

              如果它接收到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 int 的限制是 2147483647

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-07-16
                • 2011-09-02
                • 2021-06-03
                • 2014-07-25
                • 1970-01-01
                相关资源
                最近更新 更多