MySql删除部分字段重复数据

问题:表部分字段重复,需要对部分字段重复的数据,保留一条,其余删除。

1    张三    河北    12    河北唐山
2    李四    河南    20    河南郑州
3    王五    山西    10    山西太原
4    赵六    山东    31    山东济南
5    张三    河北    25    河北邢台
6    李四    山东    16    山东青岛
7    王五    湖北    45    湖北武汉
8    赵六    山东    49    山东菏泽
9    张三    河北    55    河北秦皇岛

需求:如图person表中姓名省份字段有重复数据,需要删除;

第一步,查询下重复的数据:

SELECT MIN(id) AS minId,MAX(id) AS maxId,`name`,province,COUNT(*)
FROM person
GROUP BY `name`, province
HAVING COUNT(*) > 1;

结果如下:

第二步,将重复数据存储为一个临时表;

CREATE TABLE person_temp (SELECT MIN(id),MAX(id),`name`,province,COUNT(*)
FROM person
GROUP BY `name`, province
HAVING COUNT(*) > 1);

第三步,查询出要删除的person表的数据id【因为重复的数据不止有2条,此处保留id最小的数据,删除id较大的数据;亦可以保留id最大的数据】;

SELECT p.*
FROM person p,person_temp pt 
WHERE p.`name`=pt.`name` 
AND p.province=pt.province 
AND p.id != pt.minId;

得到要删除的数据如下:

第四步,执行删除

DELETE FROM person 
WHERE id 
IN (
		SELECT p.id
		FROM person p,person_temp pt 
		WHERE p.`name`=pt.`name` 
		AND p.province=pt.province 
		AND p.id != pt.minId
);

执行发现报错了,

[SQL]DELETE FROM person 
WHERE id IN (
						SELECT p.id
						FROM person p,person_temp pt 
						WHERE p.`name`=pt.`name` 
						AND p.province=pt.province 
						AND p.id != pt.minId);
[Err] 1093 - You can't specify target table 'person' for update in FROM clause

You can't specify target table 'brand' for update in FROM clause

意思就是:不能对同一个表(person)执行先查询在删除操作;

这种操作在oracle数据库是没有问题的。替换方案就是先建一个临时表,再删除;

创建临时表:

CREATE TABLE person_id_temp(
		SELECT p.id
		FROM person p,person_temp pt 
		WHERE p.`name`=pt.`name` 
		AND p.province=pt.province 
		AND p.id != pt.minId
);

执行删除:

DELETE FROM person WHERE id IN (SELECT id FROM person_id_temp);

最终数据如下:

1    张三    河北    12    河北唐山
2    李四    河南    20    河南郑州
3    王五    山西    10    山西太原
4    赵六    山东    31    山东济南
6    李四    山东    16    山东青岛
7    王五    湖北    45    湖北武汉

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用以下 SQL 语句删除表中某个字段重复数据: ``` DELETE FROM your_table WHERE id NOT IN ( SELECT MIN(id) FROM your_table GROUP BY duplicate_field ); ``` 其中,`your_table` 是你要删除重复数据的表名,`id` 是该表的唯一标识字段,`duplicate_field` 是需要判断重复字段名。这个 SQL 语句会保留每种 `duplicate_field` 字段中 `id` 最小的数据行,其它重复数据行将被删除。请注意在使用前备份数据,以免误删重要数据。 ### 回答2: 在MySQL中,可以使用以下步骤删除字段重复数据: 1. 首先,使用SELECT语句查找出重复数据,以便确认哪些数据重复的。可以使用COUNT()函数和GROUP BY子句来实现。例如,假设有一个表名为"table_name",字段名为"column_name",可以使用以下语句查询重复数据: SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name HAVING COUNT(*) > 1; 这将返回所有重复数据及其重复次数。 2. 确认重复数据后,可以使用DELETE语句删除其中的重复记录。可以使用子查询来选择需要删除重复记录。例如,假设要删除表中字段"column_name"中的重复数据,可以使用以下子查询语句选择需要删除的记录: DELETE FROM table_name WHERE column_name IN (SELECT column_name FROM (SELECT column_name FROM table_name GROUP BY column_name HAVING COUNT(*) > 1) AS duplicate_data); 这将根据子查询选择的重复数据进行删除操作。 3. 最后,可以再次运行步骤1的SELECT语句来验证是否成功删除重复数据。如果查询结果为空,则表明已成功删除所有重复的记录。 需要注意的是,在进行删除操作之前,请务必备份数据库,以防操作失误。此外,删除数据是一个敏感操作,请谨慎使用,以免造成数据丢失。 ### 回答3: 如果要删除 MySQL 数据表中字段重复数据,可以使用以下步骤: 1. 首先,使用 DISTINCT 关键字查询需要删除字段重复数据。例如,如果我们有一个叫做 "table_name" 的数据表,并且要删除 "column_name" 字段重复数据,可以运行以下查询语句: SELECT DISTINCT column_name FROM table_name; 2. 将查询结果保存到一个临时表中。可以使用如下语句创建一个临时表: CREATE TABLE temp_table AS SELECT DISTINCT column_name FROM table_name; 3. 确保临时表中的数据是正确的,然后使用以下语句删除原始表的所有数据: DELETE FROM table_name; 4. 最后,将临时表中的数据插入到原始表中: INSERT INTO table_name SELECT * FROM temp_table; 这样,原始表中的字段重复数据将被删除,而只留下唯一的数据。记得在使用以上步骤前,先进行备份以防数据丢失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值