关于使用MySQL语法ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql

摘要:
前言:在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新,在刚碰到的时候,第一反应是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有ONDUPLICATEKEYUPDATE一步就可以完成,感觉实在是太方便了,该语句是基于唯一索引或主键使用,比如一个字段a被加上了uniqueindex,并且表中已经存在了一条记录值为1。比如:下面两个语句会有

前言:

在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新,

在刚碰到的时候,第一反应是将其实现分为两块,分别是判断增加,判断更新,后来发现在mysql中有ON DUPLICATE KEY UPDATE一步就可以完成,感觉实在是太方便了,

该语句是基于唯一索引或主键使用,比如一个字段a被加上了unique index,并且表中已经存在了一条记录值为1。

比如:

下面两个语句会有相同的效果:

INSERT INTO table (a,b,c) VALUES (1,2,3)  ON DUPLICATE KEY UPDATE c=c+1;  
  
UPDATE table SET c=c+1 WHERE a=1;

ON DUPLICATE KEY UPDATE后面可以放多个字段,用英文逗号分割。

再现一个例子:

INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);  

表中将更改(增加或修改)两条记录。

在mybatis中进行单个增加或修改sql的写法为:

<insert   paramerType="com.pojo.AreaInfo">insert into camera_info( cameraId,zone1Id,zone1Name,zone2Id,zone2Name,zone3Id,zone3Name,zone4Id,zone4Name)
    VALUES(
        #{cameraId},#{zone1Id},#{zone1Name}, #{zone2Id},
        #{zone2Name}, #{zone3Id}, #{zone3Name},
        #{zone4Id}, #{zone4Name},)
    ON DUPLICATE KEY UPDATE 
    cameraId =VALUES(cameraId),
    zone1Id = VALUES(zone1Id),zone1Name =VALUES(zone1Name),
    zone2Id = VALUES(zone2Id),zone2Name =VALUES(zone2Name),
    zone3Id = VALUES(zone3Id),zone3Name =VALUES(zone3Name),
    zone4Id = VALUES(zone4Id),zone4Name =VALUES(zone4Name)
</insert>

在mybatis中进行批量增加或修改的sql为:

<insert   parameterType="java.util.List">insert into camera_info(
          zone1Id,zone1Name,zone2Id,zone2Name,zone3Id,zone3Name,zone4Id,zone4Name,
          cameraId
          )VALUES
           <foreach collection ="list" item="cameraInfo" index= "index" separator =",">(
                #{cameraInfo.zone1Id}, #{cameraInfo.zone1Name}, #{cameraInfo.zone2Id},
                #{cameraInfo.zone2Name}, #{cameraInfo.zone3Id}, #{cameraInfo.zone3Name},
                #{cameraInfo.zone4Id}, #{cameraInfo.zone4Name}, 
                #{cameraInfo.cameraId}, 
             )
           </foreach>ON DUPLICATE KEY UPDATE
               zone1Id = VALUES(zone1Id),zone1Name = VALUES(zone1Name),zone2Id =VALUES(zone2Id),
               zone2Name = VALUES(zone2Name),zone3Id = VALUES(zone3Id),zone3Name =VALUES(zone3Name),
               zone4Id = VALUES(zone4Id),zone4Name =VALUES(zone4Name),
               cameraId =VALUES(cameraId)
    </insert>
    

免责声明:文章转载自《关于使用MySQL语法ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇LTE信令流程之专用承载流程介绍Oxygen-Dapr.EshopSample 部署随记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL学习2---索引

MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。 创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。 实际上...

CentOS7安装mysql后无法启动服务,提示Unit not found

1、最近在centos7上面进行mysql安装完成后,无法启动,报如下错误: Failed to start mysql.server.service: Unit not found. 2、这个是知乎上面找到的无法启动的答案:https://www.zhihu.com/question/41832866 3、解决办法一:使用MariaDB代替mysql数...

Eclipse 3.6 更新中文语言包的方法

在网上找3.6版的中文包更新方法,总是找不到,找到的大都是3.3、3.4的更新方法: 看到论坛里太多的人要eclipse的中文语言包,但自从3.2.1之后官方不提供单独的下载,所以很多朋友用了3.3.x的版本,原来的语言包插件都不能使用了。今天到eclipse官方查资料,看到了一个新的子项目Babel (网址:http://www.eclipse.org...

mysql_【MySQL】常见的mysql 进程state

Analyzing 线程是对MyISAM 表的统计信息做分析(例如, ANALYZE TABLE )。 checking permissions 线程是检查服务器是否具有所需的权限来执行该语句。 Checking table 线程正在执行表检查操作。 cleaning up 线程处理一个命令,并正准备以释放内存和重置某些状态变量。 closing tabl...

ref:详解MYSQL数据库密码的加密方式及破解方法

ref:https://blog.csdn.net/paul123456789io/article/details/53081921 MySQL数据库用户密码跟其它数据库用户密码一样,在应用系统代码中都是以明文出现的,在获取文件读取权限后即可直接从数据库连接文件中读取,例如asp代码中的conn.asp数据库连接文件,在该文件中一般都包含有数据库类型,物理...

DockerFile与镜像(Image)仓库

深入Docker 之 Image: 当我们使用docker pull mysql 这个命令获取镜像的时候,到底他是怎么做的?我们登录官方提供的仓库看一下 https://github.com/docker-library. 我们搜索mysql并且选择对应的版本,比如 5.7 我们会看到改目录下只有两个文件,其中最重要的则是这个Dockerfile 文件了...