【mysql】on duplicate key update

桃扇骨 2022-12-03 02:26 233阅读 0赞

1 on duplicate key update

在向数据库进行插入数据时,字段有唯一索引,并且插入的数据和数据库已存在的数据有唯一性冲突,这时会报 唯一字段异常;

解决办法:
1、 先根据唯一性先对表进行查询,如果存在,则不插入,不存在,则保存(这种方法仅仅限于单条数据插入);

  1. // 比如User 对象中的username是唯一性字段
  2. public int add(User model) {
  3. User temp = dao.selectByUsername(model.getUsername());
  4. if (temp == null) {
  5. // insert
  6. } else {
  7. // update 或其他操作
  8. }
  9. }

2、 通过on duplicate key update 进行操作

  1. INSERT INTO user( username, sex, password,create_time)
  2. VALUES
  3. ('aaa',1,'pwd-123',SYSDATE())
  4. on duplicate key update password= VALUES(password), create_time = VALUES(create_time)
  5. 或者
  6. INSERT INTO user( username, sex, password,create_time)
  7. VALUES
  8. ('aaa',1,'pwd-123',SYSDATE())
  9. on duplicate key update password= '123', create_time = sysdate()

项目中遇到的问题:批量插入,重复性问题

表结构: device_no 是unique key,如果单条查询判断是否存在是很消耗IO,在数据大的时候

在这里插入图片描述

  1. CREATE TABLE `device_sharable` (
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  3. `user_id` bigint(20) NOT NULL COMMENT '用户ID,sys_user.user_id',
  4. `device_no` varchar(100) NOT NULL COMMENT '设备序列号',
  5. `share_status` int(1) NOT NULL DEFAULT '0' COMMENT '共享状态: 0非共享 , 1 共享',
  6. `create_time` datetime DEFAULT NULL,
  7. PRIMARY KEY (`id`),
  8. UNIQUE KEY `ds_device_no_union` (`device_no`) USING BTREE
  9. ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT='可共享设备表,设备控制测试';
  10. INSERT INTO device_sharable(user_id, device_no, share_status, create_time)
  11. VALUES
  12. (199,'978796000627',0,SYSDATE()),
  13. (198,'985690000507',0,SYSDATE())
  14. on duplicate key update user_id = VALUES(user_id), create_time = VALUES(create_time)

代码中用的是批量插入

  1. <insert id="batchInsert" parameterType="List">
  2. INSERT INTO device_sharable (user_id, device_no, share_status,create_time)
  3. VALUES
  4. <foreach collection="list" item="model" separator=",">
  5. (
  6. #{model.userId},
  7. #{model.deviceNo},
  8. #{model.shareStatus},
  9. #{model.createTime}
  10. )
  11. </foreach>
  12. ON DUPLICATE KEY UPDATE user_id = VALUES(user_id), create_time = VALUES(create_time)
  13. </insert>

发表评论

表情:
评论列表 (有 0 条评论,233人围观)

还没有评论,来说两句吧...

相关阅读

    相关 on duplicate key update简单使用

    在实际应用中,经常碰到导入数据的功能,当导入的数据不存在时则进行添加,有修改时则进行更新, 在刚碰到的时候,第一反应是将其实现分为两块,分别是判断增加,判断更新,后来发现在