【问题标题】:Duplicate entry '2147483647' for key 1键 1 的重复条目“2147483647”
【发布时间】:2011-08-11 11:36:54
【问题描述】:

奇怪的问题,我似乎无法理解。我在 MySQL 数据库中有一个表,其结构如下...

    CREATE TABLE IF NOT EXISTS `tblbaseprices` (
  `base_id` bigint(11) NOT NULL auto_increment,
  `base_size` int(10) NOT NULL default '0',
  `base_label` varchar(250) default NULL,
  `base_price_1a` float default NULL,
  `base_price_2a` float default NULL,
  `base_price_3a` float default NULL,
  `base_price_1b` float default NULL,
  `base_price_2b` float default NULL,
  `base_price_3b` float default NULL,
  `site_id` int(11) default NULL,
  PRIMARY KEY  (`base_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=134 ;

最后一个 base_id 是 132。我假设有几条记录已被删除,auto_increment 设置为 134,如您所见。我正在尝试运行以下 SQL 语句,当我这样做时,我收到错误“键 1 的重复条目 '2147483647'”。

INSERT INTO tblbaseprices (site_id, base_size, base_price_1a, base_price_2a, base_price_3a, base_price_4a) VALUES ('', '', '', '', '', '')

有人有什么想法吗?

非常感谢!

【问题讨论】:

  • 为什么要将空字符串插入浮点/整数列?
  • 什么是base_price_4a?我在您的create table 中没有看到它。
  • @sapht 这可能是错误的原因。

标签: mysql


【解决方案1】:

【讨论】:

  • 作为此答案的补充,如果您使用 int 作为表的主要自动增量列,则上述数字是您可以拥有的最大值。使用bigint 来突破这个限制。
【解决方案2】:

2147483647 是 mysql 的最大 int 值。只需将类型从 int 更改为 bigint。

【讨论】:

    【解决方案3】:

    使用你的代码我得到了这个错误 - '字段列表'中的未知列'base_price_4a'。 这意味着您正在尝试插入另一个表(可能在另一个模式中),并且该表具有主键 INT 和 AUTO_INCREMENT=2147483647。

    【讨论】:

    • 好眼光。 @Doyley:请检查您是否向我们展示了正确/当前的表结构!
    • 啊..我从错误的数据库中发布了一个表,并且在将代码发布到该表时出现了错误。它试图在 php 中生成一个 ID,然后将其发布到导致其最大化的自动增量列。感谢您的帮助!
    【解决方案4】:

    您已达到 32 位整数限制,从而阻止了自动递增。将您的 pk 切换为具有更高列长度的 bigint 应该可以解决此问题。

    此外,如果您的 PK 永远不会是负数,那么切换到 unsigned int 应该会给您更多空间。

    【讨论】:

    • no, "Duplicate entry '2147483647' for key 1",其中 key 1 是主键(编辑:似乎我做了一个错误的假设,并认为发生了批量导入......)
    • 另外 PK 显然是一个未签名的 bigint
    【解决方案5】:

    尝试将 auto_increment 列更改为 bigint 而不是 int,然后最大值将是 '9223372036854775807' 或什至是 '18446744073709551615' 如果您将其设为无符号(没有低于 0 的值)。

    将您的 Auto_Increment 更改为该列中的最后一个 id,以便它从停止的地方继续。

    一定不要删除auto_increment,否则会继续报错。

    【讨论】:

      【解决方案6】:

      您正在将空字符串插入数字列。据我所知,您还插入到架构中不存在的列中。我的猜测是这与您的错误有关。

      【讨论】:

      • 这有什么关系?根据create table语句,site_id根本不是key。
      【解决方案7】:

      签名和未签名的问题

      alter table tblbaseprices
      modify column site_id int(10) unsigned NOT NULL;
      

      参考 - http://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html

      • 确保外键未签名(在这种情况下可能是site_id
      • 可能是触发器引起的,
      • 没有int(11),它可以达到的最大值是int(10)
      • 没有必要允许 ID 为负值
      • 始终使用相同的数据类型作为主键

      【讨论】:

      • 但是为什么它会出现在 AUTO_INCREMENT=134 处呢? PK专栏是个大智商。
      • 只提到key 1,我能想到的就是外键
      • Key 1 是表中的第一个键(没有key 0),而且这个表也只有一个键。
      • 是的,是的,还有一种可能是触发器引起的
      • AFAIR 你不能将 BEFORE/AFTER INSERT 触发器插入到定义它的同一个表中......不过需要检查一下。
      【解决方案8】:

      今天我收到错误duplicate key 2147483647

      我认为当我尝试从 PhpMyAdmin 向数据库中插入一条记录时,它出现了,在输入时,我还尝试输入键值,它低于当前的 Next autoindex 或者我尝试输入类似 @ 987654323@ 作为关键字段,这导致它将Next autoindex 设置为最大值

      无论如何,这个错误是因为Next autoindex 是那个表的2147483647。 我的表是空的,所以我通过这个查询修复了它:

      ALTER TABLE table_name AUTO_INCREMENT = 0
      

      如果您的表包含数据,则将 0 替换为您的最大键加上 1

      【讨论】:

        【解决方案9】:

        这是一个数据库问题。检查你的 phpmyadmin > 你的 DB > 结构,你的主键应该设置为“bigint”,而不仅仅是“int”

        【讨论】:

          【解决方案10】:
          CREATE TABLE IF NOT EXISTS `tblbaseprices` (
            `base_id` bigint(11) NOT NULL auto_increment,
            `base_size` int(10) NOT NULL default '0',
            `base_label` varchar(250) default NULL,
            `base_price_1a` float default NULL,
            `base_price_2a` float default NULL,
            `base_price_3a` float default NULL,
            `base_price_1b` float default NULL,
            `base_price_2b` float default NULL,
            `base_price_3b` float default NULL,
            `site_id` int(11) default NULL,
            PRIMARY KEY  (`base_id`)
          ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=134 ;
          

          【讨论】:

            【解决方案11】:

            这里有一个很好的解释:http://realtechtalk.com/Duplicate_entry_2147483647_for_key_PRIMARY_MySQL_Error_Solution-2015-articles

            本质上,您是在尝试插入一个大于 INT 支持的最大大小的值,这实际上是错误中提供给您的数字。

            如果您正在导入数据,则其中一个字段包含大于 INT 大小的值。您还可以将您的表修改为 BIGINT,这样也可以解决问题(当然以额外的磁盘空间为代价)。

            一个常见的原因是您正在使用一些生成大/随机数字的脚本。您应该添加一些检查以确保大小等于或小于最大 INT 大小 2147483647,这样您就可以开始了。

            【讨论】:

              【解决方案12】:

              键“app_user”的重复条目“57147-2147483647”[插入到user_lookupuser_idapp_idapp_user_idspecial_offersspecial_offersip_address)值('24265656' ', '4009116545', 1, 1854489853) ]

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-07-03
                • 1970-01-01
                • 2019-08-28
                • 2012-03-10
                • 2011-05-20
                • 2014-02-02
                • 2013-01-15
                相关资源
                最近更新 更多