从 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 约束。
我有一个 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 约束。