Mysql批量查重后存储的实现求助

求助大神,一个PHP+Mysql的项目,现从其他站点获取到了json,处理以后需要存到mysql,json里边最多可能会同时存100条数据。
本人思路:
insert into info_table (name,tel,info,time,url) values ('张三 ','15888888888','计算机系','1525765835','http://a.com,'),('李四 ','15888888881','计算机系','1525765835','http://b.com,');

但是我发现这样存储下来的结果是,如果数据库里边已经有号码tel相同的记录了,他还会再把它存下来,
tel在系统里边是唯一的,一个tel只有一条记录,所以批量存之前需要先查tel在数据库里边有没有存在,如果存在,就跳过(更新该记录的时间也行),如果不存在,就存储这条记录

表结构:
id,
name,
tel,
time,
url,
info

请求大神给一条sql解决这个问题

9个回答

如果tel是唯一的,存在则更新,不存在则插入,可以用如下sql:
insert into info_table (name,tel,info,time,url) values
('张三 ','15888888888','计算机系','1525765835','http://a.com,'),
('李四 ','15888888881','计算机系','1525765835','http://b.com,')
on duplicate key update
name=values(name),info=values(info),time=values(time),url=values(url)

itbyc
ITbyc 我知道问题在哪了,我把tel设置成唯一了,之前全部插入是没有设置tel唯一
接近 2 年之前 回复
tdcqfyl
木鱼大叔 回复itbyc: 需要把tel设置成唯一索引
接近 2 年之前 回复
itbyc
ITbyc 大神您好,tel是唯一的,但不是主键,我刚刚执行了下,他都会以最新记录插入,我是不是要改个什么
接近 2 年之前 回复

试过了,这种可以 https://my.oschina.net/jsan/blog/270161/

INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM table WHERE field = ?)

huixion
边缘颓废之 你也可以 代码去重,先一次查出表所有数据,跟json解析的数据比较去重。再把去重的数据直接批量插入就可以。感觉这种方法速度快一点
接近 2 年之前 回复
huixion
边缘颓废之 回复huixion: 写错了,是 INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM table WHERE field = ?) UNION ALL SELECT 'field1', 'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM table WHERE field = ?)
接近 2 年之前 回复
huixion
边缘颓废之 使用 UNION ALL ;这样写 INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM table WHERE field = ?) UNION ALL INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM table WHERE field = ?)
接近 2 年之前 回复
itbyc
ITbyc 请问多条应该如何造这个sql呢
接近 2 年之前 回复
itbyc
ITbyc 这个我当时调试过,我想如果100条记录同时查完存储就好了,否则每条都要执行一次的话,对服务器资源占用太厉害了
接近 2 年之前 回复
itbyc
ITbyc 谢谢大神,我调试一下试试
接近 2 年之前 回复

INSERT INTO info_table ([Columns]) SELECT [Values] WHERE NOT EXISTS (SELECT * FROM info_table WHERE TEL ='xxx')

zzm1219
别递烟哥不会 回复itbyc: 这是插入一条的语句啊,多个TEL看你的需求应该是多条语句。我没试过这个在MYSQL下行不行哦,你要自己测试下。
接近 2 年之前 回复
itbyc
ITbyc 多个tel应该如何处理呢?
接近 2 年之前 回复

可以的 insert into info_table ([Columns]) SELECT [Values] WHERE NOT EXISTS (SELECT * FROM info_table WHERE TEL ='q')

itbyc
ITbyc 多个tel应该如何处理呢?
接近 2 年之前 回复

这种需求用程序处理更合理吧,就是根据号码去重数据再保存啊

itbyc
ITbyc 那样的话需要先打开数据库进行查重,完了再打开数据库存储
接近 2 年之前 回复

应该是这个吧INSERT INTO info_table ([Columns]) SELECT [Values] WHERE NOT EXISTS (SELECT * FROM info_table WHERE TEL ='xxx')

itbyc
ITbyc 多个tel应该如何处理呢?
接近 2 年之前 回复

我觉得用程序去重吧,效率也高,再就是批量插入的话有条数限制的,初步可以定个1000条的批量插入。

给这几个项做一个唯一索引,数据库就会替你拦住他们了

itbyc
ITbyc 比如中间的一个值重复了,那么同一批次的其他值还能提交呢
接近 2 年之前 回复

后台从数据库查询是否有相同的,有就存null,无就存原始数据,不一定要数据库下手,浪费

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问