Mysql - 具有自动增量的键的重复输入错误

时间:2013-02-14 10:03:34

标签: mysql sql database

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

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它可以正常工作,但是又一次,它被设置为id所以我不应该这样做这!


注意2:好的,这是一个完整的“暮光之城”时刻:所以在使用duplicate entry errors的巨大数字运行上面的查询后,事情开始正常工作,不再是{ {1}}。 有人可以解释我WTF是在做这种奇怪的行为吗?

5 个答案:

答案 0 :(得分:10)

表格的AUTO_INCREMENT值和id列中的实际值可能已经失败了。

这可能会有所帮助:

第1步 - 从表中获取最大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 :(得分:4)

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

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

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

答案 2 :(得分:3)

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

show table status

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

答案 3 :(得分:2)

参加晚会,但我今晚遇到了这个问题 - 复制密钥'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)

创建表格语法:

CREATE TABLE `env_events` (
  `tableId` int(11) NOT NULL AUTO_INCREMENT,
  `deviceId` varchar(50) DEFAULT NULL,
  `timestamp` int(11) DEFAULT NULL,
  `temperature` float DEFAULT NULL,
  `humidity` float DEFAULT NULL,
  `pressure` float DEFAULT NULL,
  `motion` int(11) DEFAULT NULL,
  PRIMARY KEY (`tableId`)
) ENGINE=MyISAM AUTO_INCREMENT=528521 DEFAULT CHARSET=latin1

答案 4 :(得分:0)

调试此问题时,请检查表名case sensitivity(特别是如果不在Windows上运行MySql)。 例如。如果一个脚本使用大写字母来创建表格my_table&#39;另一个脚本试图插入MY_TABLE&#39;。这两个表可能具有不同的内容和不同的文件系统位置,这可能导致所描述的问题。