MySQL:密钥的重复条目(以前“idx'是什么意思?”)

时间:2016-09-29 21:57:17

标签: mysql

更新:经过大量痛苦的研究后,我发现问题实际上是什么,并更新标题以使其更有意义。我将在下面给出答案。

不幸的是,我无法复制给我这个问题的查询,因为它属于我的公司,因此我必须非常具体地保留我的问题。

我有INSERT INTO ... SELECT查询返回此错误:

Duplicate entry <gobbledygook> for key 'idx_<tablename>'

最后的表名是正确的名称,但它之前有一个奇怪的idx_前缀,它不是我正在使用的任何表的一部分。什么是idx?它与information_schema有什么关系吗?

更新:显然,我需要澄清一些事情:名称中没有idx列。

3 个答案:

答案 0 :(得分:1)

“idx_”是索引名称的通用前缀。

许多人的索引不允许该索引引用的列值的重复值。

答案 1 :(得分:1)

当我试图解决这个问题时,大量的网络搜索没有透露太多,但我终于弄明白了(JohnH的回答帮助我做到了这一点)。

我终于发现“idx”不是由MySQL创建的,而是其他人给索引的名称。我从来没有遇到过一个以前不是键的索引的唯一性约束,所以我不知道那个错误来自哪里。

此命令显示所有索引:

SHOW INDEX FROM <tablename> 

我能够看到此密钥的非唯一设置为0.

为了解决这个问题,我只需删除索引并重新创建它,而不添加唯一性约束。

DROP INDEX idx_<tablename> ON <tablename>;
ALTER TABLE <tablename> ADD INDEX idx_<tablename> (<comma-separated columns>);

是否删除唯一性约束是一个好主意仍有待观察,但它也超出了这个问题的范围。

答案 2 :(得分:0)

在我的情况下,即使被索引的列没有,唯一索引也有重复的条目。我只能认为这是由错误引起的。解决方案是

  • 停止写入数据库的服务
  • 删除索引
  • 重新创建索引
  • (执行以前失败的操作)
  • 启动服务

如果要删除重新创建的索引,则在执行此操作时不会给任何机会插入重复的条目,这一点很重要。这就是为什么我停止了写入数据库的服务的原因。