- 目录
- 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. 总结
出现错误不要紧,主要是如何解决以及预防以后同样的错误发生,解决数据库数据重复的问题方法还是挺多的,主要是根据业务和实际情况来处理,最后,共勉~