Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql高效插入/更新数据

Mysql高效插入/更新数据

作者头像
用户1075292
发布于 2018-01-23 02:46:55
发布于 2018-01-23 02:46:55
3.2K00
代码可运行
举报
文章被收录于专栏:听雨堂听雨堂
运行总次数:0
代码可运行

从tushare抓取到的财务数据,最开始只是想存下来,用的办法想简单点,是:插入--报错—update

但发现这个方法太蠢,异常会导致大量无效连接,改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        for idx,row in d2.iterrows():
            try:
                rs=db.getData("select f_Code,f_Time,%s from caiwu where f_Code=:1 and f_Time=:2"%fldname,row["code"],dat)
                if len(rs)==0:
                    db.doNonQuery("insert into caiwu (f_Code,f_Time,%s) values(:1,:2,:3)"%fldname,row["code"],dat,row[colname])
                else:
                    if rs[0][2] is None:
                        db.doNonQuery("update caiwu set %s=:1 where f_Code=:2 and f_Time=:3"%fldname,row[colname],row["code"],dat)
            except:
                log.errorlogger().exception("数据入库错误!")

运行没啥大问题,但就是太慢,取两年数据,万条左右,一早上还没全部入库。只得研究优化,结果发现mysql居然有专门的语法,可以插入记录,遇到重复记录则为自动更新:

ON DUPLICATE KEY UPDATE

上面的处理直接用一条sql语句就解决了:

代码语言:js
AI代码解释
复制
INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;

然后再进一步,批量入库也没问题,还能分别处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO TABLE (a,b,c) VALUES 
(1,2,3),
(2,5,7),
(3,3,6),
(4,8,2)
ON DUPLICATE KEY UPDATE b=VALUES(b);

简直不要太方便:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#数据入库:
#   d2:待入库dataframe,第一列为code,第二列为数值
#   dat:时间
#   fldname:数据在库中的字段名
def addtodb(d2,dat,fldname):    
    i=0
    while i<len(d2): 
        kvs=reduce(lambda x,y:"%s%s('%s' , '%s' , %s)"%(x,"" if x=="" else ",",y[0],dat,y[1]),d2.values[i:i+1000],"")
        sqlstr="insert into caiwu (f_Code,f_Time,%s) values %s ON DUPLICATE KEY UPDATE %s=VALUES(%s)"%(fldname,kvs,fldname,fldname)
        try:
            db.doNonQuery(sqlstr)
        except:
            log.errorlogger().exception("数据入库错误!")
        i+=1000    

测试,基本上瞬间入库!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-10-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
18 . Go之操作Mysql和sqlx使用
bindvars的一个常见误解是,它们用来在sql语句中插入值。它们其实仅用于参数化,不允许更改SQL语句的结构。例如,使用bindvars尝试参数化列或表名将不起作用:
iginkgo18
2022/05/09
1.9K0
mybatis 实现插入或更新数据功能,数据存在时只更新
在mysql中,提供有on duplicate key update 指令,该指令表示如果唯一索引(UNIQUE)或主键(PRIMARY KEY)出现重复值时,则执行更新操作;如果不存在唯一冲突,则执行插入操作。
鳄鱼儿
2024/05/21
9590
Java向Oracle数据库表中插入CLOB、BLOB字段
在需要存储较长字符串到数据库中时往往需要使用一些特殊类型的字段,在Oracle中即blob和clob字段,一般而言:Clob字段存储字符信息,比如较长的文字、评论,Blob字段存储字节信息,比如图像的base64编码。
ZONGLYN
2019/08/08
7.4K0
restapi(8)- restapi-sql:用户自主的服务
学习函数式编程初衷是看到自己熟悉的oop编程语言和sql数据库在现代商业社会中前景暗淡,准备完全放弃windows技术栈转到分布式大数据技术领域的。但是在现实中理想总是不如人意,本来想在一个规模较小的公司展展拳脚,以为小公司会少点历史包袱,有利于全面技术改造。但现实是:即使是小公司,一旦有个成熟的产品,那么进行全面的技术更新基本上是不可能的了,因为公司要生存,开发人员很难新旧技术之间随时切换。除非有狂热的热情,员工怠慢甚至抵制情绪不容易解决。只能采取逐步切换方式:保留原有产品的后期维护不动,新产品开发用一些新的技术。在我们这里的情况就是:以前一堆c#、sqlserver的东西必须保留,新的功能比如大数据、ai、识别等必须用新的手段如scala、python、dart、akka、kafka、cassandra、mongodb来开发。好了,新旧两个开发平台之间的软件系统对接又变成了一个问题。
用户1150956
2019/10/30
1.6K0
mysql技巧:如果记录存在则更新/如果不存在则插入的三种处理方法
新增一个员工时,如果该员工已存在(以员工号f_emp_code作为判断依据),则更新,否则插入。而且工资f_salary,更新时,不得低于原工资(即:工资只能涨,不能降)。
菩提树下的杨过
2018/12/21
10.7K0
2.Go语言项目操作MySQL数据库实践
快速了解 MySQL 数据库 MySQL 是目前主流关系型的数据库,它的胞胎兄弟 MariaDB (MySQL 的一个分支),除此之外使用最多的就是 Oracle 和 PostgreSQL 数据库。
全栈工程师修炼指南
2022/09/29
6.9K0
2.Go语言项目操作MySQL数据库实践
mysql insert duplicate key update 死锁分析
数据入库这块有离线和实时两套入库系统,写同一个db的同一批mysql表,两边用的都是insert into table on duplicate key update这种方式。实时一直运行,离线5分钟更新一次,当两套系统同时运行时出现了死锁问题,频率还挺高。事务的隔离级别是read committed 读提交。
YG
2021/03/04
4.5K1
MySQL_插入更新 ON DUPLICATE KEY UPDATE
1、效率太差,每次执行都要执行2个sql 2、高并发的情况下数据会出问题,不能保证原子性
全栈程序员站长
2022/08/09
7640
MySQL插入重复后进行覆盖更新
在MySQL中,常常会有唯一键的约束,当使用Java插入重复的值后,会报异常我们需要进行捕获处理。
半月无霜
2023/10/26
7850
Go 语言操作 MySQL 之 SQLX 包
友情提示:此篇文章大约需要阅读 14分钟5秒,不足之处请多指教,感谢你的阅读。 、
Meng小羽
2020/07/08
1.9K0
Go 语言操作 MySQL 之 CURD 操作
友情提示:此篇文章大约需要阅读 10分钟 52秒,不足之处请多指教,感谢你的阅读。
Meng小羽
2020/07/03
9390
42.QT-QSqlQuery类操作SQLite数据库(创建、查询、删除、修改)详解
Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作。这里我们所说的“平台 独立”,既包括操作系统平台,也包括各个数据库平台,Qt支持以下几种数据库:
诺谦
2019/06/14
14.1K0
【详解】MySQL实现无数据插入,有数据更新
在数据库操作中,经常会遇到这样的需求:当某条记录不存在时,需要插入一条新的记录;如果该记录已经存在,则需要更新这条记录的某些字段。这种操作通常被称为“Upsert”(即“Update or Insert”的缩写)。本文将探讨如何在MySQL中实现这一功能。
大盘鸡拌面
2025/07/25
6090
使用iOS原生sqlite3框架对sqlite数据库进行操作
      sqlite数据库是一种小型数据库,由于其小巧与简洁,在移动开发领域应用深广,sqlite数据库有一套完备的sqlite语句进行管理操作,一些常用的语句和可视化的开发工具在上篇博客中有介绍,地址如下:
珲少
2018/08/15
2.4K0
使用iOS原生sqlite3框架对sqlite数据库进行操作
MySQL 如何实现重复插入时更新
最近 MySQL 数据库经常报错 Duplicate key 的错误,虽然我已经在 Insert 之前使用 query 进行了判断,如果已有则更新,但是还是经常会报这个错误,经过一段查询资料,发现 MySQL 已经提供了两种解决方法:
Denis
2023/04/15
1.3K0
MSSQL之二十一 存储过程案例
张哥编程
2024/12/17
1770
.NET Dapper的正确使用姿势
和EF相比,手写sql当修改表结构不易发现bug。 习惯了EF后再来使用Dapper,会很难适应那种没有了强类型的安全感。不过可以用单元测和心细来避免。
郑子铭
2024/02/26
4970
.NET Dapper的正确使用姿势
大批量更新数据mysql批量更新的四种方法
mysql 批量更新如果一条条去更新效率是相当的慢, 循环一条一条的更新记录,一条记录update一次,这样性能很差,也很容易造成阻塞。
Spark学习技巧
2022/01/13
34.6K0
C++ 之 VS2010 和MySQL数据库的链接问题
if (0 == mysql_library_init(0, NULL, NULL)) {
恒辉信达
2024/11/22
2010
[MYSQL] 自定义mysql脱敏中间件 -- 对指定连接进行指定字段的数据脱敏
昨天群友有这么一个需求: 对应特定的连接查询特定的表字段的时候,对其进行脱敏. 比如: select name, phone from tblname where id=xxx 查询出来的phone需要是脱敏的.即显示为:152****6666这种样子.
大大刺猬
2025/04/08
3090
[MYSQL] 自定义mysql脱敏中间件 -- 对指定连接进行指定字段的数据脱敏
推荐阅读
相关推荐
18 . Go之操作Mysql和sqlx使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验