实现SQL查询的数据去重

【今日推荐】:为什么一到面试就懵逼!>>> hot3.png

  • 目录
  • 1.前言
  • 2. 解决思路
  • 2.1 查询重复数据
  • 2.2使用insert ignore .....SQL语句忽略重复
  • 2.3 清空数据库,重新插入数据
  • 2.4 不动数据库,查询忽略重复数据
  • 2.5 定向删除数据库的重复数据
  • 3. 总结

1. 前言

前几天,调用第三方接口将接口数据存到数据库,处理逻辑上应该是没有问题的,但检查的时候,发现数据库居然出现数据重复的情况,下面我们来看看为什么会出现这样的情况,在读取数据的时候怎么预防这样的Bug??

2. 解决思路

2.1 查询重复数据

首先,先查询重复数据,SQL语句如下:

SELECT COUNT(*) as repetitions, partnerid

FROM t_ystaccountfile_detail

GROUP BY partnerid

HAVING repetitions > 1;

以上查询语句将返回 t_ystaccountfile_detail 表中重复的记录数。 一般情况下,查询重复的值,执行以下操作:

确定哪一列包含的值可能会重复。

在列选择列表使用COUNT(*)列出的那些列。

在GROUP BY子句中列出的列。

HAVING子句设置重复数大于1。

2.2使用insert ignore .....SQL语句忽略重复

INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。

区别如下:

指令

已存在

不存在

举例

insert

报错

插入

insert into names(name, age) values(“小明”, 23);

 

insert ignore

忽略

插入

insert ignore into names(name, age) values(“小明”, 24);

 

replace

替换

插入

replace into names(name, age) values(“小明”, 25);

 

(1)插入已存在,忽略新插入的记录,id会自增,不会报错

mysql> insert ignore into names(name, age) values("大壮", 25);

Query OK, 0 rows affected, 1 warning (0.00 sec)

(2)插入不存在,添加新的记录

mysql> insert ignore into names(name, age) values("壮壮", 25);

Query OK, 1 row affected (0.01 sec)

2.3 清空数据库,重新插入数据

该方法适合数据量不大,而且接口支持指定日期查询,开发者只需要编写一个循环入库函数即可实现(使用该方法需要确保插入数据是不重复的)

2.4 不动数据库,查询忽略重复数据

如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。

比如下面SQL语句:
$sql = "SELECT DISTINCT * FROM `t_ystaccountfile_detail` AS p1 WHERE {$where}  ORDER BY `id` DESC limit {$limits}";

当然,也可以使用GROUP BY 来分类读取数据表中不重复的数据:

select 字段名 from 数据表 group by 字段名;

2.5 定向删除数据库的重复数据

先创建临时表,将数据不重复的插入到临时表,然后再删除原表,将临时表名改为原表名,操作如下:

mysql> CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl  GROUP BY (last_name, first_name, sex);

mysql> DROP TABLE person_tbl;

mysql> ALTER TABLE tmp RENAME TO person_tbl;

也可以根据索引和主键的特性,删除标的重复记录

mysql> ALTER IGNORE TABLE person_tbl

    -> ADD PRIMARY KEY (last_name, first_name);

3. 总结

出现错误不要紧,主要是如何解决以及预防以后同样的错误发生,解决数据库数据重复的问题方法还是挺多的,主要是根据业务和实际情况来处理,最后,共勉~

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值