33

我正在使用 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 的错误?谢谢。

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

4

17 回答 17

23

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

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;
于 2012-10-30T04:30:38.867 回答
15

我知道在这种情况下这不是问题,但是在创建复合主键时我遇到了类似的“重复条目”问题:

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 值,您会收到这些错误。最后,错误消息有点误导我。

于 2015-09-03T20:32:48.063 回答
4

我有一个类似的问题,但在我的情况下,我使用了不区分大小写的排序规则 - utf8_general_ci

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

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

于 2019-03-25T17:37:16.023 回答
1

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

在导入期间,一些键被截断,截断的版本不再是唯一的。花了一段时间才弄明白,我当时想“但是这个所谓的重复键根本不存在!”。

于 2016-07-06T08:33:38.227 回答
1

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

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

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

于 2016-09-02T12:40:59.623 回答
1

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

运行在线 ALTER TABLE 操作时,运行 ALTER TABLE 操作的线程将应用 DML 操作的“在线日志”,这些操作是从其他连接线程在同一张表上同时运行的。应用 DML 操作时,可能会遇到重复键条目错误(ERROR 1062 (23000): Duplicate entry),即使重复条目只是暂时的并且会被“在线日志”中的后续条目恢复. 这类似于 InnoDB 中的外键约束检查的想法,其中约束必须在事务期间保持。

于 2019-03-06T19:42:33.943 回答
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;
于 2012-10-30T04:27:42.353 回答
0

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

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

我认为您正在执行第二次查询(插入...)两次。尝试

select * from my_table

在插入新行之前,您会知道您的数据是否已经存在。

于 2012-10-30T04:31:49.570 回答
0

我刚试过,如果你有数据和表重新创建不起作用,只需将表更改为 InnoDB 并重试,它会解决问题

于 2016-06-19T07:14:47.493 回答
0

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

于 2016-07-19T00:13:23.157 回答
0

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

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

于 2016-10-06T07:08:55.023 回答
0

就我而言,该错误非常具有误导性。问题是当您单击“使唯一”按钮而不是“ALTER IGNORE TABLE”时,PHPMyAdmin 使用“ALTER TABLE”,所以我必须手动进行,例如:

ALTER TABLE mytbl ADD UNIQUE (columnName);
于 2017-03-19T22:16:49.650 回答
0

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

该错误实际上表示的是挂起的键值是空白的。

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

于 2018-02-15T16:50:01.143 回答
0

对我来说,餐桌上的 noop 就足够了(已经是 InnoDB):

ALTER TABLE $tbl ENGINE=InnoDB;
于 2020-06-25T07:55:16.253 回答
0

tl;博士:我的视图显示我的表是空的,但视图排除了现有行。

我遇到了同样的问题,但我的问题是因为我插入了之前使用过的相同测试行。当我检查我的表是否为空时,我使用了一个排除不同租户的视图,因此搜索结果为空。当我检查实际表时,以前的记录仍然存在。

一旦我删除了现有记录,插入就起作用了。只有半天的挫败感输给了这个……

于 2021-09-28T03:14:48.443 回答
0

出现此错误,当添加复合主键时,ADD PRIMARY KEY (column1, column2, ...)该行中所有列的值不得重复。

例如:你做ADD PRIMARY KEY (name, country, number)

姓名 国家 数字
科林 英国 5
科林 英国 5

这将引发错误#1062 - Duplicate entry 'collin-UK-5' for key 'PRIMARY',因为合并的列有重复

因此,如果您看到这种格式的错误,只需检查并确保要添加复合主键以组合的列没有重复项。

于 2022-01-31T09:15:11.563 回答
-2

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

于 2012-10-30T04:36:20.027 回答