从 mysql 中的主键中删除单列

Delete single column from primary key in mysql

我有一个 table,其主键包含 5 列。我发现这些列之一不应该在主键中,因为它正在创建重复项。我正在尝试删除此列(从主键和完全从 table)删除此列,但失败了。

最初我只是使用 MySQL Workbench 取消选择作为 PK 的列,然后单击应用。 workbench 生成此 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'

我不在乎哪个副本幸存下来,我只希望我的主键正确并且最后留下一些数据。

我找到了解决办法。您可以通过以下方式相互比较记录来从 table 中删除记录:

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;

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

一旦完成,我就能够成功地 运行 原来的 ALTER 语句。

I don't care which duplicate survives, I just want my primary key to be correct

如果您的新 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 约束。