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

use*_*581 22 mysql primary-key duplicates mysql-error-1062

我正在使用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;
Run Code Online (Sandbox Code Playgroud)

它包含这两行:

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

现在我想插入另一行:

INSERT INTO `my_table` (`number`, `name`, `money`) VALUES
(2, 'S. Name', 240);
Run Code Online (Sandbox Code Playgroud)

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

#1062 - Duplicate entry '2-S. Name' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Kam*_*mil 18

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

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

您的表甚至没有UNIQUE,因此该表上的错误是不可能的.

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

也许你试图运行它CREATE TABLE IF NOT EXIST.它没有创建,你有旧版本,但没有错误,因为IF NOT EXIST.

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

DESCRIBE my_table;
Run Code Online (Sandbox Code Playgroud)

编辑 - 稍后添加:

试着运行这个:

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;
Run Code Online (Sandbox Code Playgroud)

  • `PRIMARY KEY`(在MySQL中)_is_`UNIQUE`。因此,添加UNIQUE键是完全多余的(而且很浪费)。这适用于任何引擎,不一定适用于MyISAM。 (2认同)

car*_*rla 8

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

ALTER TABLE table ADD PRIMARY KEY(fieldA,fieldB); 
Run Code Online (Sandbox Code Playgroud)

错误是这样的:

#1062 Duplicate entry 'valueA-valueB' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)

所以我搜索了:

select * from table where fieldA='valueA' and fieldB='valueB'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 就我而言,我有一个小数字段,它告诉我有一个重复值,但事实并非如此。不过,我确实使用[这个技巧](/sf/answers/48198601/)检查了其他重复值,并确实找到了3。我解决了这些问题并能够创建索引。 (2认同)

Rus*_*der 6

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

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

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