mysql数据某字段重复。删除该记录
如:人员信息,身份证号重复,依据记录添加的时间,保留最新的,删除之前历史记录
方式1:只适用于数据量少的情况
1、查询重复数据并且按照添加时间正序排列
SELECT
t.id
FROM
(
SELECT
t.id
FROM
t_user_info t
ORDER BY
t.add_time
LIMIT 100000000 --保证分组时,能按照添加时间,获取之前的数据的id
) t
GROUP BY
t.idno
HAVING --获得重复数据
count(idno) > 1
2、删除历史数据
DELETE
FROM
t_user_info
WHERE
id IN (
SELECT
t.id
FROM
(
SELECT
t.*
FROM
t_user_info t
ORDER BY
t.add_time
LIMIT 100000000
) t
GROUP BY
t.idno
HAVING
count(idno) > 1 -- id 在重复的数据中
)
方式二:数据量大的情况下(几百万至上千万),数据重复
方式1的语句中,先查询重复数据的id,再用in语句删除相应id的数据。数据量大的时候,无法执行;解决方式,将重复的数据存入临时表中,删除直接关联临时表进行处理。同理,大批量数据处理是也可以采用该方式。
1、创建临时表
CREATE TABLE `t_temp_member` (
`id` varchar(50) NOT NULL COMMENT '主键',
`source_id` varchar(100) DEFAULT NULL COMMENT '需要处理数据的id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='处理重复数据的临时表';
2、将需要删除的数据主键(或者是其他判断条件)存入临时表
INSERT INTO t_temp_member(id, source_id) (
SELECT
t.id,t.source_id
FROM
(
SELECT
t.id,t.source_id
FROM
t_member_info t -- 待处理的数据表
WHERE
t.delstatus = 0
ORDER BY
t.mod_time -- 正序排序,将需要删除的数据保存至临时表中
LIMIT 10000000000
) t
GROUP BY
t.source_id
HAVING
count(source_id) > 1)
3、关联查询删除数据
delete a.* from t_member_info a, t_temp_member b where a.id = b.id ;