我需要上传一个excel文档里的数据到mysql数据库中,并且要对excel文件中的身份证这一列进行查询,如果数据库中已经存在了相同的身份证,则这一条记录不会导入。
目前我使用这条语句来查询的:
SELECT id FROM information WHERE idcard = '$sfz' LIMIT 1
如果返回的结果条数大于0,那么就存在了。
可是这样一条一条进行查询并判断后再插入数据库,5000多条数据需要近1分钟的时间才能完成。
请问大家有没有更好的办法呢?

解决方案 »

  1.   

    这是最好的方法了。你还想乍子搞呢~或你给idcard字段加个唯一键重复了让他INSERT不进去。
      

  2.   

    a.唯一键
    b.insert 改为 replace 
      

  3.   

    那就你那样没什么不妥了。或你给idcard 加个索引。不过像你这样一次select 一次INSERT,更新索引也耗时。
    要么设置延时mysql更新索引的时间,
    要不全部一次select判断后给记录加个tag标记下再insert。
      

  4.   

    测试了下,没加索引,需要38秒,加了唯一键索引后,需要32秒,把insert改为replace后也是32秒。还是需要蛮长的时间呀。
      

  5.   

    如何延时mysql更新索引的时间呢?谢谢
      

  6.   

    insert ignore into tb(...) value(...) 用这种形式试试。
      

  7.   

    对MyISAM有效的。你可以看下这篇文章吧。
    http://www.itokit.com/2011/1216/72781.html
    最好还是觉得来一次select判断后加个tag或组成新数组,像楼上那样一次insert。
    不过这样你又得注意sql的长度,一条sql长度又有限制的。
      

  8.   

    你一次一条insert都需30多秒?
    还是select跟insert……
      

  9.   

    一条一条的select再一条一条的insert
      

  10.   

    我执行了alter table information delay_key_write =1这条语句后,再执行导入,还是需要32秒
      

  11.   

    把你的excel导入一致临时表中.执行以下语句试试:
    insert into tt select * from tem where 
    idcard not in
      (
        select idcard from tt
      )
      

  12.   

    考虑insert之后判断下mysql_errorno(1062表示字段值重复,入库失败),前提是idcard为unique.
      

  13.   

    插5000次啊。 肯定不是php来完成的,存入消息队列,写消费者进程去入库啊。
      

  14.   

    先读取所有的身份证到字符串变量$ids_string,用逗号连接,如 1,2,3,4,5……
    然后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)取差集就可以得出哪些身份证号是不重复的。
      

  15.   

    为什么不换个思路呢?
    比如
    把所有身份证取出来,
    放到数据库查询一次 in query
    找出数据库已存在存在的身份证列表
    从excel的源数据中删除这些身份证数据
    然后剩余的一次性插入,速度会快很多的
    加快速度的根本就是减少访问数据库次数
    放在在程序内存中执行,最后插入数据
      

  16.   

    我是 用phpExcelReader来导入excel的,但是似乎只能一条一条的插入数据库,如何一次性插入呢?
      

  17.   

    我用的phpExcelReader来导入数据的,它用的是foreach循环数组来一条一条的插入,如何一次性插入呢?