多套程序往同一 MYSQL 中插入

场景

多套拉取 API 的程序,分别放在多台独立服务器中定时执行。由于所有程序链接的是同一个 MYSQL,写入时会有很条插入失败,因为 MYSQL 中设置了唯一字段对应 API 中的 ID

想法

新增一个字段,如果数据不存在就插入一条新的,如果存在就把此字段 +1,但这样就意味着插入前就必须要先 select 一下是否存在,请问有没有比较好的方法?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

用mysql的 INSERT INTO xxx ON DUPLICATE KEY UPDATE 方法, 这个是条件必须是一个唯一索引,如果不存在就插入,存在就更新。 但是这个方法的唯一缺点就是特别浪费自增ID,相当于每操作一次都会自增+1? 这个laravel中也支持,好像是 upsert 这个方法吧。你可以试试。。

11个月前 评论
畅畅 (楼主) 11个月前
讨论数量: 15
陈先生

建议全都插临时表,然后由多个消费程序来做

不要查,直接 update

两个方案

11个月前 评论

可以考虑用 redis 的 setnx 实现。或者搞个本地文件锁也可以。只要不能拿到,那就表示别的进程在处理了。

11个月前 评论

核心还是在于锁,或者原子性,也可以借助布隆过滤器在插入前过滤,

11个月前 评论

要解决什么问题呢,或者预想的结果是什么

11个月前 评论

去搜下 replace into,我猜你要的就是这个。

11个月前 评论

用mysql的 INSERT INTO xxx ON DUPLICATE KEY UPDATE 方法, 这个是条件必须是一个唯一索引,如果不存在就插入,存在就更新。 但是这个方法的唯一缺点就是特别浪费自增ID,相当于每操作一次都会自增+1? 这个laravel中也支持,好像是 upsert 这个方法吧。你可以试试。。

11个月前 评论
畅畅 (楼主) 11个月前

replace into 是正解

11个月前 评论

INSERT INTO xxx ON DUPLICATE KEY UPDATEREPLACE INTO 产生死锁的概率较高,慎用

11个月前 评论
mengdodo

把自增id的动作放在redis中,每次insert前先到redis中做incr动作,会返回给你自增后的id,带着id再执行insert

11个月前 评论

正常不应该就依赖 MySQL 的自增 ID 么...难道插入的时候要指定 ID?

11个月前 评论

sql语句可以解决,mysql是很强的的

11个月前 评论

laravel有个方法是 updateOrCreate 思路虽然也是先查询再更新 但是用这个方法便捷一些

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!