6

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

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 1 id在这种情况下并没有足够auto_increment的能力来指定它吗?

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


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

4

5 回答 5

14

可能是表的 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 值?

希望能帮助到你。

于 2013-02-14T10:21:26.043 回答
5

我有同样的问题,这是我的解决方案:

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

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

于 2014-01-04T20:50:49.410 回答
4

派对迟到了,但我今晚刚刚遇到这个 - 重复键'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
于 2017-06-06T01:08:22.840 回答
3

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

show table status

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

于 2013-02-14T10:25:01.327 回答
0

When debugging this problem check the table name case sensitivity (especially if you run MySql not on Windows). E.g. if one script uses upper case to 'CREATE TABLE my_table' and another script tries to 'INSERT INTO MY_TABLE'. These 2 tables might have different contents and different file system locations which might lead to the described problem.

于 2015-11-26T00:59:20.310 回答