即使没有重复条目,MySQL重复输入错误

时间:2012-10-30 04:13:47

标签: mysql primary-key mysql-error-1062 duplicates

我正在使用MySQL 5.1.56,MyISAM。我的表看起来像这样:

CREATE TABLE IF NOT EXISTS `my_table` (
  `number` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `money` int(11) NOT NULL,
  PRIMARY KEY (`number`,`name`)
) ENGINE=MyISAM;

它包含以下两行:

INSERT INTO `my_table` (`number`, `name`, `money`) VALUES
(1, 'S. Name', 150), (2, 'Another Name', 284);

现在我想插入另一行:

INSERT INTO `my_table` (`number`, `name`, `money`) VALUES
(2, 'S. Name', 240);

MySQL告诉我这个时不会插入它:

#1062 - Duplicate entry '2-S. Name' for key 'PRIMARY'

我真的不明白。主键位于前两列(两者都是),因此我尝试插入的行是唯一的主键,不是吗?

我试图修复表,我试图优化表,一切都无济于事。另请注意,我无法从MyISAM更改为InnoDB。

我错过了什么或者这是MySQL或MyISAM的错误吗?感谢。

总结并指出我认为的问题所在(即使不应该): 表具有两列的主键。我试图在这两列中插入一个具有新值组合的行,但第一列中的值已经在某行中,第二列中的值已经在另一行中。但它们并没有任何组合,所以我相信这应该有效,而且我很困惑,看到它没有。

15 个答案:

答案 0 :(得分:15)

您的代码和架构都可以。您可能正在尝试使用以前版本的表。

http://sqlfiddle.com/#!2/9dc64/1/0

您的表甚至没有UNIQUE,因此该表上无法发生错误。

从该表备份数据,删除并重新创建。

也许您试图运行CREATE TABLE IF NOT EXIST。它没有创建,你有旧版本,但由于IF NOT EXIST没有错误。

您可以像这样运行SQL以查看当前的表结构:

DESCRIBE my_table;

编辑 - 稍后添加:

尝试运行:

DROP TABLE `my_table`; --make backup - it deletes table

CREATE TABLE `my_table` (
  `number` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  `money` int(11) NOT NULL,
  PRIMARY KEY (`number`,`name`),
  UNIQUE (`number`, `name`) --added unique on 2 rows
) ENGINE=MyISAM;

答案 1 :(得分:8)

我知道在这种情况下这不是问题,但我有类似的问题" Duplicate Entry"创建复合主键时:

ALTER TABLE table ADD PRIMARY KEY(fieldA,fieldB); 

错误类似于:

#1062 Duplicate entry 'valueA-valueB' for key 'PRIMARY'

所以我搜索了一下:

select * from table where fieldA='valueA' and fieldB='valueB'

输出显示只有1行,没有重复!

经过一段时间后,我发现如果您在这些字段中有NULL值,则会收到这些错误。最后,错误信息有点误导我。

答案 2 :(得分:1)

在我的情况下,错误是由过时的架构引起的,一列最初是varchar(50)但我尝试导入的转储是从具有varchar(70)的架构的修改版本创建的列(以及使用超过50个字符的该字段的一些条目)。

在导入过程中,某些键被截断,截断的版本不再是唯一的。花了一段时间才弄明白,我就像“但这个假设重复的钥匙甚至不存在!”。

答案 3 :(得分:1)

不太常见的情况,但请记住,根据DOC https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-limitations.html

  

运行联机ALTER TABLE操作时,运行ALTER TABLE操作的线程将应用DML操作的“联机日志”,该DML操作是在其他连接线程的同一表上同时运行的。应用DML操作时,即使重复输入只是临时的,并且会被“在线日志”中的后续输入还原,也可能会遇到重复的键输入错误(错误1062(23000):重复的输入)。 。这类似于InnoDB中的外键约束检查的想法,在约束检查中,约束必须在事务期间保持。

答案 4 :(得分:0)

尝试自动增量:

CREATE TABLE IF NOT EXISTS `my_table` (
   `number` int(11) NOT NULL AUTO_INCREMENT,
   `name` varchar(50) NOT NULL,
   `money` int(11) NOT NULL,
    PRIMARY KEY (`number`,`name`)
) ENGINE=MyISAM;

答案 5 :(得分:0)

您的代码在此演示中运行良好:

http://sqlfiddle.com/#!8/87e10/1/0

我认为您正在进行两次查询(插入...)。试试

select * from my_table

在插入新行之前,您将获得数据已存在与否。

答案 6 :(得分:0)

我刚刚尝试过,如果你有数据和表重新生成无法工作,只需将表改为InnoDB并再试一次,它就能解决问题

答案 7 :(得分:0)

如果其他人发现我的问题这个帖子 - 我在MySQL中使用了“整数”列类型。我试图插入的行有一个主键,其值大于整数允许的值。切换到“bigint”解决了问题。

答案 8 :(得分:0)

如果这对OP以外的任何人有帮助,我使用 InnoDB 时遇到了类似的问题。

对我来说,真正发生的是外键约束失败。我正在引用一个不存在的外键。

换句话说,错误完全消失了。主键很好,插入外键首先解决了问题。不知道为什么MySQL突然出错了。

答案 9 :(得分:0)

根据您的代码,您的"号码"和"姓名"是主键,并且您在两行中都插入了S.NAME,因此会产生冲突。我们使用primarykey来访问完整的数据。在这里,您无法使用主键'名称'来访问数据。

我是初学者,我认为这可能是错误。

答案 10 :(得分:0)

在我的情况下,错误是非常误导的。问题是PHPMyAdmin使用" ALTER TABLE"当你点击"制作独特的"按钮代替" ALTER IGNORE TABLE",所以我不得不手动完成,如:

ALTER TABLE mytbl ADD UNIQUE (columnName);

答案 11 :(得分:0)

添加列或使用现有列作为主键时,通常会创建此问题。它不是由于存在从未实际创建的主键或由于表的损坏而创建的。

错误实际表示的是挂起的键值为空。

解决方案是使用唯一值填充列,然后再次尝试创建主键。 不能显示空白,空值或重复值,否则会出现此误导性错误。

答案 12 :(得分:0)

我有一个类似的问题,但就我而言,事实证明我使用了不区分大小写的排序规则-utf8_general_ci

因此,当我尝试插入在区分大小写的比较中不同但在不区分大小写的比较中相同的两个字符串时,MySQL触发了错误并且我不明白是什么问题,因为我使用了区分大小写的搜索。

解决方案是更改表的排序规则,例如我使用的utf8_bin区分大小写(或者utf8_general_cs也应该是区分大小写的。)

答案 13 :(得分:0)

对我来说,在表上打个op就足够了(已经是InnoDB了):

ALTER TABLE $tbl ENGINE=InnoDB;

答案 14 :(得分:-2)

在查看错误#1062 - Duplicate entry '2-S. Name' for key 'PRIMARY'时,它表示您在数字字段中使用主键,这就是为什么它在数字字段上显示重复错误的原因。 所以删除这个主键然后它也插入重复。