MySql快速插入以及批量更新

插入:

MySql提供了可以一次插入多条数据的用法:

[sql]

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9),(10,11,12)...; 

在程序中可以通过循环,添加Values对应的列表,最后使用一次executeUpdate完成插入操作。但是Mysql语句并不是越长越好,MYsql语句长度有限制,可以查看mysql的配置文件my.in中max_allowed_packet属性,并进行相应设置。

更新:

Mysql中没有提供像Insert一样一次更新多条记录,需要逐条语句拼接。

[sql]

update weibo set userName = 'xyw' where id = '22';update weibo set userID = '143' where id = '35'; 

你可以使用addBatch语句,将拼接起来的SQL语句进行一次性处理,但是效率并不高。

还需要处理resultset的释放问题,否则mysql会报错:"Commands out of sync; you can't run this command now"

针对update语句,虽然并没有resultset返回,但仍然需要释放。而由于未知原因(可能是sql语句太长?),释放resultset非常耗时,最终算下来得不偿失。

针对以上的不足,可以使用另一种方法执行批量更新。

[sql]

INSERT INTO tbl_name [col_name1, col_name2,...)] VALUES(col_value1,col_value2,...), (col_value1,col_value2,...)ON DUPLICATE KEY UPDATE userName=VALUES(userName) 

使用这种方法必须满足条件:col_name1, col_name2,...中必须有主键或者唯一键。

userName是要更新的列。

如果想一次更新多列,可以在userName=VALUES(userName)后面继续添加,例如:

[sql]

INSERT INTO tbl_name [col_name1, col_name2,...)] VALUES(col_value1,col_value2,...), (col_value1,col_value2,...)ON DUPLICATE KEY UPDATE userName=VALUES(userName), userID = VALUES(userID) 

这样就可以同时更新userName和userID两个字段。

它的实现原理是,首先Mysql根据表名后面列出的主键,查找表(因为是主键,所以在表中唯一存在)。如果存在该行数据,则按照最后的col_name = values(col_name)列表对相应的字段,按照values列表中给出的值进行更新。建议:表名后面的字段列表,除了主键之外,列出来的最好都作为更新的对象,即在语句最后都要有相应的col_name = values(col_name),否则,你在表名后罗列出来字段,在values中赋值了,但是不是更新的对象,显然是浪费。

如果不存在该行数据,则进行插入操作,没有作为更新对象的列按照默认值填充(前提是Mysql运行在非严格模式下。如果在严格模式下,没列都需要有默认值,否则运行出错)。

注意:

主键可以作为更新的对象 ,但是只是在表中不存在该记录时起作用,即执行了插入操作,如果表中已经存在了该主键对应的行数据,下次更新时不会再插入该行,而是执行除了主键之外的其他列的更新操作。所以最好不要将主键设置为更新的对象。

实例:

[sql]

INSERT INTO keywordtable(id, keyword, userName, userID) VALUES(1, '你好', 'Eliot', 22), (2, 'hello', 'Jhon', 23),  

(3, '嘻嘻', 'Jim', 24) ON DUPLICATE KEY UPDATE keyword=VALUES(keyword), userName=VALUES(userName),userID=VALUES(userID); 

除了id外,字段有keyword, userName, userID,他们是要更新的字段。

MySql快速插入以及批量更新的更多相关文章

  1. mysql根据查询结果批量更新多条数据(插入或更新)

    mysql根据查询结果批量更新多条数据(插入或更新) 1.1 前言 mysql根据查询结果执行批量更新或插入时经常会遇到1093的错误问题.基本上批量插入或新增都会涉及到子查询,mysql是建议不要对 ...

  2. mybatis+mysql批量插入和批量更新、存在及更新

    mybatis+mysql批量插入和批量更新 一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo, ...

  3. spring data jpa开启批量插入、批量更新

    spring data jpa开启批量插入.批量更新 原文链接:https://www.cnblogs.com/blog5277/p/10661096.html 原文作者:博客园--曲高终和寡 *** ...

  4. MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.

    mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...

  5. MySQL 避免重复数据的批量插入与批量更新

    [转发] 导读 我们在向数据库里批量插入数据的时候,会遇到要将原有主键或者unique索引所在记录更新的情况,而如果没有主键或者unique索引冲突的时候,直接执行插入操作. 这种情况下,有三种方式执 ...

  6. mybatis+mysql批量插入和批量更新

    一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo,oo,oo) mybatis中mapper.x ...

  7. mybatis批量插入和批量更新

    批量插入数据使用的sql语句是: insert into table (aa,bb,cc) values(xx,xx,xx),(oo,oo,oo) mybatis中mapper.xml的代码如下: & ...

  8. 【MySQL】MySQL快速插入大量数据

    起源 在公司优化SQL遇到一个索引的问题,晚上回家想继续验证,无奈没有较多数据的表,于是,想造一些随机的数据,用于验证. 于是 于是动手写.由于自己不是MySQL能手,写得也不好.最后,插入的速度也不 ...

  9. Mybatis 批量插入、批量更新

            合理的使用批量插入.更新对性能优化有很大的作用,速度明显快了N倍.         要注意数据库连接串后面要新增:&allowMultiQueries=true,表示一个sql ...

随机推荐

  1. C语言基础三(敲打键盘、寻找资料,循环语句)

    有人在学C语言或者其他语言的时候,大家都会说逻辑思维的硬道理,认为没有逻辑思维的人走不远,那么小编这里借助简单的if...else... 英文解释if(如果),else(否则) ----------- ...

  2. acm--博弈入门2(P/N分析)--(HDU 1847 HDU 2188 HDU 3863)

    P/N理论 分析博弈时可以用P/N分析法 具体如下: P点:即必败点,某玩家位于此点,只要对方无失误,则必败: N点:即必胜点,某玩家位于此点,只要自己无失误,则必胜. 必败态:一定输 必胜态:一定赢 ...

  3. BZOJ4039 : 集会

    将曼哈顿距离转化为切比雪夫距离,即: $|x_1-x_2|+|y_1-y_2|=\max(|(x_1+y_1)-(x_2+y_2)|,|(x_1-y_1)-(x_2-y_2)|)$ 那么每个点能接受的 ...

  4. PAT基础6-2

    6-2 多项式求值 (15 分) 本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑​i=0​n​​(a[i]×x​i​​) 在x点的值. 函数接口定义: dou ...

  5. docker 报错: Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

    centos 启动docker服务报错: Job for docker.service failed because the control process exited with error cod ...

  6. DeepCas:an end-to-end predictorof information Cascades

  7. [Asp.net core]使用ssh命令发布asp.net core项目

    命令 # 移除之前发布的包 rm -rf ./.Publish rm -rf ./Wolfy.Blog.tar.gz # 编译并发布 将发布包打包在.Publish目录下 -o "../.P ...

  8. 制作chrome插件/扩展程序,禁止谷歌浏览器访问某些网站

    简单地说,浏览器插件,可以大大的扩展你的浏览器的功能.包括但不仅限于这些功能: 捕捉特定网页的内容 捕捉HTTP报文 捕捉用户浏览动作,改变浏览器地址栏/起始页/书签/Tab等界面元素的行为 与别的站 ...

  9. mysql调优最大连接数

    一.mysql调优 1.1 报错: Mysql: error 1040: Too many connections 1.2 原因: 1.访问量过高,MySQL服务器抗不住,这个时候就要考虑增加从服务器 ...

  10. ThunderBird对只有回复地址的邮件过滤

    回复地址,其实就是reply-to 增加一个自定义的字段:reply-to即可