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

在刚碰到的时候,第一反应是将其实现分为两块,分别是判断增加,判断更新,后来发现在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 id="insertOrUpdateCameraInfoByOne" 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 id="insertOrUpdateCameraInfoByBatch" 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>

最新文章

  1. 跨平台运行 Rafy 首次部署记录
  2. docker 配置操作指导
  3. jquery修改css样式,样式带!important
  4. Jnotify文件监控的用法以及Jar文件导入的方法
  5. timestamp 与 rowversion
  6. image和字节流之间的相互转换
  7. gdb调试高级用法
  8. Android牛博
  9. 《Javascript高级程序设计》读书笔记之闭包
  10. (简单) CF 44D Hyperdrive,数学。
  11. 【二十四】使用mysqli扩展类批量执行多条sql语句
  12. centos7 yum 安装 redis
  13. 【Android】Mac下Android Studio设置App启动页
  14. 【BZOJ2001】[HNOI2010]城市建设(CDQ分治,线段树分治)
  15. CopyFromScreen在屏幕缩放情况下需要做处理
  16. 多个Tomcat之间实现Session共享
  17. 914. X of a Kind in a Deck of Cards
  18. cesiumjs学习笔记之三——cesium-navigation插件 【转】
  19. openGL 变换06
  20. 安装Ubuntn 和 pycharm

热门文章

  1. C# System.Windows.Forms.Panel
  2. 解决vue项目打包之后出现源代码的问题
  3. java如何生成一个0-100的随机整数?
  4. .babelrc配置例子
  5. magento开发 -- 修改当前用户的客户组
  6. 「ZJOI2019」线段树 解题报告
  7. openSSL实现AES加密
  8. 使用redis实现客户端和服务端token验证
  9. linux进阶之路(三):vi/vim编辑器
  10. mongo之$rename更新一个字段的名称(可批量)