我需要上传一个excel文档里的数据到mysql数据库中,并且要对excel文件中的身份证这一列进行查询,如果数据库中已经存在了相同的身份证,则这一条记录不会导入。
目前我使用这条语句来查询的:
SELECT id FROM information WHERE idcard = '$sfz' LIMIT 1
如果返回的结果条数大于0,那么就存在了。
可是这样一条一条进行查询并判断后再插入数据库,5000多条数据需要近1分钟的时间才能完成。
请问大家有没有更好的办法呢?
目前我使用这条语句来查询的:
SELECT id FROM information WHERE idcard = '$sfz' LIMIT 1
如果返回的结果条数大于0,那么就存在了。
可是这样一条一条进行查询并判断后再插入数据库,5000多条数据需要近1分钟的时间才能完成。
请问大家有没有更好的办法呢?
b.insert 改为 replace
要么设置延时mysql更新索引的时间,
要不全部一次select判断后给记录加个tag标记下再insert。
http://www.itokit.com/2011/1216/72781.html
最好还是觉得来一次select判断后加个tag或组成新数组,像楼上那样一次insert。
不过这样你又得注意sql的长度,一条sql长度又有限制的。
还是select跟insert……
insert into tt select * from tem where
idcard not in
(
select idcard from tt
)
然后select * from information where idcard IN ($ids_string)
查询出结果之后用foreach将idcard都压入数组$cards_array
用$ids_array = explode(',',$ids_string);将字符串分割为数组
然后用PHP自带函数array_intersect($ids_array,$cards_array)取交集不就可以得出哪些身份证号有重复了?
用array_diff($ids_array,$cards_array)取差集就可以得出哪些身份证号是不重复的。
比如
把所有身份证取出来,
放到数据库查询一次 in query
找出数据库已存在存在的身份证列表
从excel的源数据中删除这些身份证数据
然后剩余的一次性插入,速度会快很多的
加快速度的根本就是减少访问数据库次数
放在在程序内存中执行,最后插入数据