【问题标题】:Mysql - duplicate entry error for key with auto incrementMysql - 自动增量键的重复输入错误
【发布时间】:2013-02-14 10:03:34
【问题描述】:

为什么我会收到表单错误:

Error in query: Duplicate entry '10' for key 1

...当执行如下 INSERT 语句时:

INSERT INTO wp_abk_period (pricing_id, apartment_id) VALUES (13, 27)

...13 和 27 是现有 pricingapartment 行的有效 id-s,表定义为:

CREATE TABLE `wp_abk_period` (
  `id` int(11) NOT NULL auto_increment,
  `apartment_id` int(11) NOT NULL,
  `pricing_id` int(11) NOT NULL,
  `type` enum('available','booked','unavailable') collate utf8_unicode_ci default NULL,
  `starts` datetime default NULL,
  `ends` datetime default NULL,
  `recur_type` enum('daily','weekly','monthly','yearly') collate utf8_unicode_ci default NULL,
  `recur_every` char(3) collate utf8_unicode_ci default NULL,
  `timedate_significance` char(4) collate utf8_unicode_ci default NULL,
  `check_in_times` varchar(255) collate utf8_unicode_ci default NULL,
  `check_out_times` varchar(255) collate utf8_unicode_ci default NULL,
  PRIMARY KEY  (`id`),
  KEY `fk_period_apartment1_idx` (`apartment_id`),
  KEY `fk_period_pricing1_idx` (`pricing_id`),
  CONSTRAINT `fk_period_apartment1` FOREIGN KEY (`apartment_id`) REFERENCES `wp_abk_apartment` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_period_pricing1` FOREIGN KEY (`pricing_id`) REFERENCES `wp_abk_pricing` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

在这种情况下,key 1idauto_increment 上是否足以不指定它?

注意:如果我只是为id 提供一个未使用的值,例如INSERT INTO wp_abk_period (id, pricing_id, apartment_id) VALUES (3333333, 13, 27),它可以正常工作,但话又说回来,它被设置为auto_increment,所以我不需要这样做!


注意 2:好的,这是一个完整的“暮光之城”时刻: 所以在运行上面的查询后,使用大量的 id,事情开始正常工作,不再是 duplicate entry errors . 谁能解释一下,WTF 是 MySQL 是为了产生这种奇怪的行为吗?

【问题讨论】:

  • 这张表上有 INSERT 触发器吗?
  • 不(或者至少我不这么认为)。我用上面的 create 语句自己创建了所有表。 show create table wp_abk_period 的输出在上面列出,show triggers 没有返回任何内容......另外,如果我只是为 id 提供一个未使用的值,它工作正常......

标签: mysql sql database


【解决方案1】:

可能是表的 AUTO_INCREMENT 值和 id 列中的实际值不正常。

这可能会有所帮助:

第 1 步 - 从表中获取 Max id

select max(id) from wp_abk_period

第 2 步 - 对齐表上的 AUTO_INCREMENT 计数器

ALTER TABLE wp_abk_period AUTO_INCREMENT = <value from step 1 + 100>;

第 3 步 - 重试插入

至于 为什么 AUTO_INCREMENT 已经失控了,我不知道。数据在表中后添加 auto_increment?数据插入表后改变了auto_increment值?

希望对你有帮助。

【讨论】:

  • 谢谢!不幸的是,(1)“在数据进入表后添加 auto_increment”和(2)“在将数据插入表后更改了 auto_increment 值?”据我所知,发生了一些其他“神秘”的事情,我现在正试图阻止它再次发生......
【解决方案2】:

我遇到了同样的问题,这是我的解决方案:

我的 ID 列有一个错误的参数。是Tinyint,MySql要写第128行。

有时,你认为越大的问题只是一个很小的参数......

【讨论】:

  • 对于那些需要这个的人,你用alter table my_table auto_increment=1, modify column my_id integer not null auto_increment;修复它这会将auto_increment重置为最大值+ 1,并使用auto_increment字段重新创建列。
【解决方案3】:

聚会迟到了,但我今晚刚刚遇到这个问题 - 重复键“472817”并且提供的答案没有帮助。

一时兴起就跑了:

repair table wp_abk_period

哪个输出

Number of rows changed from 472816 to 472817

好像mysql的行数错误,问题就消失了。

我的环境:

mysql  Ver 14.14 Distrib 5.1.73, for Win64 (unknown)

创建表语法:

创建表`env_events`( `tableId` int(11) NOT NULL AUTO_INCREMENT, `deviceId` varchar(50) 默认为空, `timestamp` int(11) 默认为 NULL, `温度`浮动默认为空, `湿度`浮动默认为空, `压力`浮动默认为空, `motion` int(11) 默认为 NULL, 主键(`tableId`) ) 引擎=MyISAM AUTO_INCREMENT=528521 默认字符集=latin1

【讨论】:

  • 您能否详细介绍一下您使用的表引擎、键类型和索引?让其他人知道何时 mysql 会错误地计算行数,因为如果确实如此,这似乎是一个大错误。或者更好的是,向他们(我的意思是 mysql 或 mariadb 团队)实际报告错误会很棒......
  • 我在开发环境中使用的是旧版本的 mysql,所以我不认为引擎可以完美运行。
  • 'Late' 是相对的。两天前我用它来修复我们的数据库。所以谢谢:)
【解决方案4】:

您可以使用以下命令检查 auto_increment 的当前值:

show table status

然后检查id的最大值,看看是否正确。如果不更改表的 auto_increment 值。

【讨论】:

  • 有用。向我展示了我已经通过更新更新了 auto_increment。谢谢。
【解决方案5】:

在调试这个问题时,检查表名case sensitivity(尤其是如果你不在 Windows 上运行 MySql)。 例如。如果一个脚本使用大写来“CREATE TABLE my_table”,而另一个脚本尝试“INSERT INTO MY_TABLE”。这 2 个表可能具有不同的内容和不同的文件系统位置,这可能会导致所描述的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多