爬虫, mysql 唯一索引 重复数据 ID 会自增。请问怎么解决? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
mon3

爬虫, mysql 唯一索引 重复数据 ID 会自增。请问怎么解决?

  •  
  •   mon3 2018 年 12 月 26 日 6170 次点击
    这是一个创建于 2677 天前的主题,其中的信息可能已经有所发展或是发生改变。
    看了一下 scrapy 没这问题。
    第 1 条附言    2018 年 12 月 26 日
    mysql MD5 字段唯一索引,新增数据重复了,导致 ID 也自动增长了。

    怎么解决新增数据重复 ID 不自增?》
    41 条回复    2019-01-14 13:06:24 +08:00
    holajamc
        1
    holajamc  
       2018 年 12 月 26 日
    虽然我不懂你说了什么,但是 INSERT 数据难道 ID 不应该自增?
    bestie
      &nbp; 2
    bestie  
       2018 年 12 月 26 日
    不懂你说了什么,插了数据当然会自增,不知道你是怎么判断重复的,重复的跳过就是了
    Vegetable
        3
    Vegetable  
       2018 年 12 月 26 日
    我猜是说,判断重复的数据后并灭有插入,但是 ID 却消耗掉了.可能和 on duplicate key update 的问题类似吧.
    xkeyideal
        4
    xkeyideal  
       2018 年 12 月 26 日
    难道爬虫都不过滤重复数据了么,布隆过滤器了解一下
    mon3
        5
    mon3  
    OP
       2018 年 12 月 26 日
    @xkeyideal 过滤不了,也没用。只能在数据库上设置唯一索引。
    gouchaoer2
        6
    gouchaoer2  
       2018 年 12 月 26 日
    用框架就意味着你失去灵活性,就这么简单的任务都无法搞定,所以少用框架
    lihongjie0209
        7
    lihongjie0209  
       2018 年 12 月 26 日
    @mon3 你数据能设置唯一索引, 你代码过滤不了? 数据库不是代码??
    loveCoding
        8
    loveCoding  
       2018 年 12 月 26 日
    这是业务问题,跟框架没什么关系
    Mac
        9
    Mac  
       2018 年 12 月 26 日
    你该去好好看看 INSERT 语句 ON DUPLICATE 时的用法了。
    EvilCult
        10
    EvilCult  
       2018 年 12 月 26 日
    同意 3 楼....
    是不是写入的时候用的是“ replace into ”
    而不是 “ on duplicate key update ”
    xpresslink
        11
    xpresslink  
       2018 年 12 月 26 日
    以前用过 scrapy+django+djangoitem 爬到内容直接用 django ORM 入库,每条信息都会有一个唯一索引用识别,
    再爬的时候 Foo.objects.get_or_create(defaults__exact='bar', defaults={'defaults': 'baz'})
    glacer
        12
    glacer  
       2018 年 12 月 26 日
    @EvilCult on duplicate key update 也会导致原 id 变化的
    aborigine
        13
    aborigine  
       2018 年 12 月 26 日
    @EvilCult #10 无论 replace into 还是 on duplicate key 都会导致 id+1
    xpresslink
        14
    xpresslink  
       2018 年 12 月 26 日
    @xpresslink #11,写错了应该是用 .objects.update_or_create,没有就新建,有就更新。
    mon3
        15
    mon3  
    OP
       2018 年 12 月 26 日
    @Mac ON DUPLICATE ID 一样会自增。
    mon3
        16
    mon3  
    OP
       2018 年 12 月 26 日
    @xpresslink 表的数据有的不能更新的,所以这个办法不太适合我。。
    xpresslink
        17
    xpresslink  
       2018 年 12 月 26 日
    @mon3
    字段唯一索引,新增数据重复了,然后 你的处理逻辑是什么?直接丢弃 /新建一个 /更新?
    请说出你的故事。
    mon3
        18
    mon3  
    OP
       2018 年 12 月 26 日
    @xpresslink 有重复数据的话直接丢弃,这步 mysql 自动执行了,但是 ID 也会增长,我需要的是 ID 不增长,数据直接丢。
    holajamc
        19
    holajamc  
       2018 年 12 月 26 日
    @mon3 既然这样的需求,为什么不考虑用布隆过滤器进行过滤呢…
    mon3
        20
    mon3  
    OP
       2018 年 12 月 26 日
    @holajamc 主要数据太多上亿,采集无法 24 小时开。
    realpg
        21
    realpg  
    PRO
       2018 年 12 月 26 日
    innodb 不重复都会出现跳 ID 事务机制导致的
    xpresslink
        22
    xpresslink  
       2018 年 12 月 26 日
    @mon3

    alter table tablename drop column id;
    alter table tablename add id mediumint(8) not null primary key auto_increment first;
    xpresslink
        23
    xpresslink  
       2018 年 12 月 26 日
    我觉得没有必要执念于此。
    holajamc
        24
    holajamc  
       2018 年 12 月 26 日
    @mon3 采集完全没有必要 24 小时工作呀,而且上亿的数据布隆过滤器足够应付…
    gaius
        25
    gaius  
       2018 年 12 月 26 日
    是自增主键跳了吗,正常,多线程插入就会跳。
    hikarugo
        26
    hikarugo  
       2018 年 12 月 26 日
    gouchaoer2
        27
    gouchaoer2  
       2018 年 12 月 26 日
    @fyxtc ???!!!
    tingfang
        28
    tingfang  
       2018 年 12 月 26 日
    on duplicate key update 重复是会跳号的。
    EvilCult
        29
    EvilCult  
       2018 年 12 月 26 日
    @glacer
    @aborigine
    我读书少你们两个不要骗我, 我要是没记错的话:
    设置 UNIQUE 索引后(比如 A)
    执行 INSERT INTO `TABLE` (A,B) VALUES (123,456) ON DUPLICATE KEY UPDATE B = 456;
    这是更新旧有行的吧~~
    rocketman13
        30
    rocketman13  
       2018 年 12 月 26 日
    看 mysql 日志就可以了,应该是先写入,再删除
    chinvo
        31
    chinvo  
       2018 年 12 月 26 日
    自己实现 UPDATE OR INSERT 啦

    如果你用 orm,一般 orm 会提供的

    没提供的话也就是查询两次的事,一次查 ID 是否存在,一次插入 /更新数据
    mon3
        32
    mon3  
    OP
       2018 年 12 月 26 日
    @chinvo 哪个 ORM 可以实现?
    chinvo
        33
    chinvo  
       2018 年 12 月 26 日
    @mon3 我用 sqlalchemy,没仔细研究,应该是没有的,所以我查两次
    ooh
        34
    ooh  
       2018 年 12 月 26 日
    lz 是发现主键 ID 不连续吧,MySQL InnoDB 插入数据是先自增主键 ID,然后再写入数据,因为你有唯一键,所以重复的时候插入失败,但是主键 ID 已经自增了,如果你没办法保证插入不重复的数据,那么把 InnoDB 换成 MyISAM 即可
    aborigine
        35
    aborigine  
       2018 年 12 月 26 日
    @EvilCult 你去试试就知道了
    Mac
        36
    Mac  
       2018 年 12 月 26 日 via Android
    @mon3 哦,我理解题目错了,我以为是出现重复记录。原来是自增跳号。innodb 就是这样的,myisam 没有这个问题。
    EvilCult
        37
    EvilCult  
       2018 年 12 月 26 日 via iPhone
    @aborigine 等下,看了 34 楼,我发现我好像看错题了……………………
    你们说的是 on duplicate update 后再查数据自增 ID 不连续吧…………[手动捂脸]
    chengxiao
        38
    chengxiao  
       2018 年 12 月 26 日
    加一层 redis set 去重啊 入库前先判断 set 里有没有 有了 pass 没有了 set+1 入库
    另外你不要爬一条插一条啊 肯定是到最后一起提交的
    Nick2VIPUser
        39
    Nick2VIPUser  
       2018 年 12 月 26 日
    很早遇到这个问题,不过我觉得这不算问题,id 只是一个唯一标识而已,跳号其实没有影响;
    如果可以的话,在数据爬完之后另外找一个库重新写入一遍也是可以的。
    qaz564172564
        41
    qaz564172564  
       2019 年 1 月 14 日
    去重啊,偷懒的话 url 设为主键不久 ok 了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2818 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 88ms UTC 14:42 PVG 22:42 LAX 07:42 JFK 10:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86