数据库去重--通过取得重复字段的非最小主键(id)来删除
程序员文章站
2022-03-03 20:03:01
...
数据库一张表如下,表名为book,要求:去除重复的name,保留一个。
一:创建获得重复名称的且除了最小bid的所有重复bid的视图。(有点绕哈哈),类似如下:
1.找出所有重复的所有bid(为了可观我加了name):
//根据找到重复的name,再冲Book表找到bid主键
select bid,name from book where name in
(
//找到计数大于1的,即有重复的name
select t.name from (
select name,count(*) as dise from book group by name
) t where t.dise>1
);
2.根据一的结果可以创建视图:非最小重复name的所有bid,即上图除了2和6的所有bid。
CREATE VIEW diff_remove AS //视图名为diff_remove
select h.bid from ( //嵌套一层查询以免报mysql才会出现的错误=。=
select bid from book where name in //找到所有重复name的Bid
(
select t.name from (
select name,count(*) as dise from book group by name
) t where t.dise>1
)
) h where bid not in //在所有重复name的Bid中取非最小Bid
(
select min(bid) from book where name in //取得所有重复name的Bid中最小的Bid
(
select t.name from (
select name,count(*) as dise from book group by name
) t where t.dise>1
) group by name
);
3.获得id后就可以直接在book表根据条件删除啦!
delete from book where bid in
(
select t.bid from (select bid from diff_remove) t
);
4.结果如下:
5.可以改进的地方,可以把“找到所有重复name的Bid”也创建一个视图,减少重复代码。
上一篇: 数据库对象—序列
下一篇: 数据库索引问问题,主键重复