工作中,我們經常有需要刪除一些重復數據的這種需求。重復數據可能是程序bug造成的
好,讓我們看看如何刪除這些重復數據
刪除重復數據的思路呢,是這樣的,查看根據這個重復字段分組后的結果有沒有大于1的情況
如果有大于的1的情況呢,那就說明是有重復數據的!
1) 創建數據庫
create database ceshi;
2) 創建表
CREATE TABLE t1 (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
name varchar(20) not null,
createdAt timestamp NOT NULL DEFAULT current_timestamp(),
updatedAt timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
3) 插入數據insert into t1 values(null,'haha',now(),now()),(null,'haha',now(),now()),(null,'xixi',now(),now()),(null,'heihei',now(),now()),(null,'hoho',now(),now()),(null,'hoho',now(),now()),(null,'sasa',now(),now()),(null,'haha',now(),now()),(null,'sasa',now(),now()),(null,'xixi',now(),now());
4) 查看數據select * from t1;
5) 根據最小id,重復字段name分組,假設我們的需求就是最后要保留第最小id的這些數據,把其它重復的刪除
select min(id),name from t1 group by name having count(name)>1 order by id;
6) 使用別名關聯一下,這些數據就是重復的,最后要刪除的
select a.*
from t1 a,(select *,min(id) from t1 group by name having count(name)>1)as b where a.name=b.name and a.id>b.id;
7) 記得先備份一下數據
create table bak_t1_20190621 like t1;
insert into bak_t1_20190621 select * from t1;
8) 刪除數據
delete a from t1 a,(select *
,min(id) from t1 group by name having count(name)>1)as b where a.name=b.name and a.id>b.id;
9) 最后檢查一下,確實已經沒有重復數據了
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。