我有一个包含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'
我不关心哪个副本存活,我只是希望我的主键是正确的,并在最后留下一些数据。
答案 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约束。