从mysql中的主键中删除单个列

时间:2015-02-05 09:25:41

标签: mysql duplicates primary-key multiple-columns

我有一个包含5列主键的表。我发现其中一列不应该在主键中,因为它创建了重复项。我正在尝试并且无法删除此列(无论是从主键还是完全从表中删除)。

最初我只是使用MySQL Workbench将列取消选择为PK,然后单击Apply。工作台生成此SQL:

ALTER TABLE `mydb`.`mytable` 
DROP PRIMARY KEY,
ADD PRIMARY KEY (`column1`, `column2`, `column3`, `column4`);

这会导致以下错误:

ERROR 1062: Duplicate entry '624634475-17-2-19000' for key 'PRIMARY'

我猜测数据库不喜欢重复条目的存在。所以我做了一些关于如何删除重复项的搜索,并发现了这个:

ALTER IGNORE TABLE mytable ADD UNIQUE (column1, column2, column3, column4)

此查询也失败并显示错误:

Error Code: 1062. Duplicate entry '624634475-17-2-19000' for key 'column1'

我不关心哪个副本存活,我只是希望我的主键是正确的,并在最后留下一些数据。

2 个答案:

答案 0 :(得分:1)

我找到了解决方案。您可以通过以下方式将记录相互比较来删除表中的记录:

DELETE t FROM table t, table u WHERE t.column2 < u.column2 AND t.column1 = u.column1 AND t.column3 = u.column3 AND t.column4 = u.column4 AND t.column5 = u.column5;

在此查询中,column2是我要删除的列,而其他4列是我想要保留在主键中的列。除了一个之外,新定义中相同的所有记录都将被删除。

完成后,我能够成功运行原始的ALTER语句。

答案 1 :(得分:0)

  

我不关心哪个副本存活,我只想要我的主键   是正确的

如果您的新PK由第1列到第4列组成,并且第1列到第5列目前是唯一的,您可以使用

SELECT column1, column2, column3, column4, MIN(column5)
FROM mytable
GROUP BY column1, column2, column3, column4

为列1 ... 4的每个唯一组合获得完全一个记录。

然后你可以继续删除mytable中所有(旧)PK与上面选择的值不匹配的记录。

之后,第1列...... 4将是唯一的,您可以重新创建PK约束。