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快速插入以及批量更新

时间: 2024-08-06 15:59:39

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

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

一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo,oo,oo) mybatis中mapper.xml的代码如下: <!-- 批量插入数据 --> <insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true"> <sel

mybatis批量插入和批量更新

在工作中遇到这一块,也是百度解决了烦恼.在此整理了一下. /** * <p> * 数据展示内容配置明细 Mapper 接口 * </p> * * @author dsh123 * @since 2018-05-23 */ public interface AdminDataContentDetailMapper extends BaseMapper<AdminDataContentDetail> { public void insertBatch(@Param(valu

mysql进阶 十四 批量更新与批量更新多条记录的不同值实现方法

mysql 批量更新与批量更新多条记录的不同值实现方法 在mysql中批量更新我们可能使用update,replace into来操作,下面详细介绍mysql批量更新与性能. 批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value'; 如果更新同一字段为同一个值,mysql也很简单,修改下where即可: UPDATE mytable SE

Mysql快速插入千万条测试数据

通过存储过程来添加数据: drop procedure if exists t1; create procedure t1() begin DECLARE i INT DEFAULT 0; DECLARE j INT DEFAULT 0; WHILE (i <= 15000000) DO INSERT INTO `test` (`code`, `name`) VALUES ('sdfasdfas','aaa'); SET i = i + 1; if mod(i,1000)=0 then comm

mybatis Oracle 批量插入,批量更新

传入的参数只要是list类型的参数就行了..............1.批量插入 <insert id="insertBatch" parameterType="java.util.List"> INSERT INTO T_CITY_INDEX( id,city_code ) select SEQ_CITY_INDEX.NEXTVAL,cd.* from( <foreach collection="list" item=&quo

【java】【mybatis】在使用mybatis进行批量插入,批量更新等批量操作时,切割In集合List进行分批批量操作的java中的切割代码

红字部分代表mybatis的批量操作调用方法: int num = 0; int maxLength = 200; int size = usableCodes.size(); if (size <= maxLength) { bean = createBean(bean,entity,usableCodes); num = receiptMapper.receipt(bean); } else { // 计算循环次数 int eachTime = (size / maxLength) + 1;

c#mysql批量更新的两种方法

总体而言update 更新上传速度还是慢. 1:  简单的insert  速度稍稍比MySqlDataAdapter慢一点 配合dapper 配置文件 <?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Versio

EF 批量更新

EF5批量插入 在园里看到别人的文章,将下面两个属性设为false会提高批量插入的效率, db.Configuration.AutoDetectChangesEnabled = false; db.Configuration.ValidateOnSaveEnabled = false; 于是自己试了下,确实速度更快,代码如下: // 批量插入 public ActionResult BulkInsert() { int count = 1000; string check = null; Mov

mysql妙用:批量插入记录,遇到重复记录则为自动更新

在更新大量数据时可能同时遇到两个问题: 如果每条更新执行一次sql性能很低,也容易造成阻塞: 批量更新时又有可能遇到主键重复的问题 使用 ON DUPLICATE KEY UPDATE 一条sql解决批量更新和主键重复问题(id为主键) INSERT INTO mytable(id,pid,ele,anim)  VALUES (?,?,?,?),(?,?,?,?),(?,?,?,?) ON DUPLICATE KEY UPDATE pid=VALUES(pid),ele=VALUES(ele)