我有一个表,但它没有唯一 ID 或主键。
它总共有 3 列。
我想删除一个名为 Ben 的条目。
所以输出看起来像这样
大多数示例显示删除具有 ID 或主键的重复条目。但是,如何在删除其他条目的同时保留一个条目?
使用下面的查询我能够得到重复的行
SELECT name, user_id, role_id, count(*) FROM some_table
GROUP BY name, user_id, role_id
HAVING count(*) > 1
澄清一下,我希望删除这些行。
最好不要创建新表。
最佳答案
如果不用担心其他用户访问该表——
CREATE TABLE `new_table` AS
SELECT DISTINCT `name`, `user_id`, `role_id`
FROM `old_table`;
RENAME TABLE
`old_table` TO `backup`,
`new_table` TO `old_table`;
或者您可以使用重复查询来输出大量单行删除查询 -
SELECT
`name`,
`user_id`,
`role_id`,
COUNT(*),
CONCAT('DELETE FROM some_table WHERE name=\'', `name`, '\' AND user_id=\'', `user_id`, '\' AND role_id=\'', `role_id`, '\' LIMIT 1;') AS `delete_stmt`
FROM `some_table`
GROUP BY `name`, `user_id`, `role_id`
HAVING COUNT(*) > 1;
或者你可以临时添加一个 SERIAL 列,然后在删除后删除它 -
ALTER TABLE `some_table` ADD COLUMN `temp_id` SERIAL;
DELETE `t1`.*
FROM `some_table` `t1`
LEFT JOIN (
SELECT MIN(`temp_id`) `min_temp_id`
FROM `some_table`
GROUP BY `name`, `user_id`, `role_id`
) `t2` ON `t1`.`temp_id` = `t2`.`min_temp_id`
WHERE `t2`.`min_temp_id` IS NULL;
ALTER TABLE `some_table` DROP COLUMN `temp_id`;
关于mysql - 删除重复的条目,同时保留一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70342021/