首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

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

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

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

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

    没提供的话也就是查询两次的事,一次查 ID 是否存在,一次插入 /更新数据
        32
    mon3   59 天前
    @chinvo 哪个 ORM 可以实现?
        33
    chinvo   59 天前
    @mon3 我用 sqlalchemy,没仔细研究,应该是没有的,所以我查两次
        34
    ooh   59 天前
    lz 是发现主键 ID 不连续吧,MySQL InnoDB 插入数据是先自增主键 ID,然后再写入数据,因为你有唯一键,所以重复的时候插入失败,但是主键 ID 已经自增了,如果你没办法保证插入不重复的数据,那么把 InnoDB 换成 MyISAM 即可
        35
    aborigine   59 天前
    @EvilCult 你去试试就知道了
        36
    Mac   59 天前 via Android
    @mon3 哦,我理解题目错了,我以为是出现重复记录。原来是自增跳号。innodb 就是这样的,myisam 没有这个问题。
        37
    EvilCult   59 天前 via iPhone
    @aborigine 等下,看了 34 楼,我发现我好像看错题了…………囧…………
    你们说的是 on duplicate update 后再查数据自增 ID 不连续吧…………[手动捂脸]
        38
    chengxiao   59 天前
    加一层 redis set 去重啊 入库前先判断 set 里有没有 有了 pass 没有了 set+1 入库
    另外你不要爬一条插一条啊 肯定是到最后一起提交的
        39
    Nick2VIPUser   59 天前
    很早遇到这个问题,不过我觉得这不算问题,id 只是一个唯一标识而已,跳号其实没有影响;
    如果可以的话,在数据爬完之后另外找一个库重新写入一遍也是可以的。
        40
    pan404   58 天前
    你是想说数据重复了没清洗掉吧
        41
    qaz564172564   40 天前
    去重啊,偷懒的话 url 设为主键不久 ok 了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1619 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 16:40 · PVG 00:40 · LAX 08:40 · JFK 11:40
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1