位置: IT常识 - 正文

MySql -- 不存在则插入,存在则更新或忽略(mysql如果不存在就创建表)

编辑:rootadmin
MySql -- 不存在则插入,存在则更新或忽略 1.前言

推荐整理分享MySql -- 不存在则插入,存在则更新或忽略(mysql如果不存在就创建表),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql表不存在则创建表,mysql不存在的数据类型,mysql不存在则创建表,mysql不存在则增加字段,mysql不存在查询,mysql不存在则新增,mysql不存在则创建表,mysql不存在则增加字段,内容如对您有帮助,希望把文章链接给更多的朋友!

Mysql在插入数据时,需要忽略或替换掉重复的数据(依据某个字段,比如Primary Key或

Unique Key来确定是否重复),这时候我们既可以在应用层处理,也可以使用复杂的 SQL 语句来处理(如果仅仅知道一些简单的 SQL 语法的话),当然也可以使用一些简单的 SQL 语法,不过它并不是通用所有的数据库类型。

下面我们以MySQL为例,研究一下insert 怎样去忽略或替换重复数据

2.表实例

表名称:person

表字段:

Column Name

Primary Key

Auto Increment

Unique

id

true

true

name

true

age

初始表数据:

id

name

age

111

Bruce

36

3.三个简单例子:

Note:本文的3个例子都需要被插入的表中存在UNIQUE索引或PRIMARY KEY字段

1. 不存在则插入,存在则更新1.1 on duplicate key update

如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则执行UPDATE语句,例:

MySql -- 不存在则插入,存在则更新或忽略(mysql如果不存在就创建表)

INSERT INTO `person`(`name`, `age`) VALUES(‘Bruce’, 18) ON DUPLICATE KEY UPDATE `age`=19; – If will happen conflict, the update statement is executed

– 2 row(s) affected

这里受影响的行数是2,因为数据库中存在name='Bruce'的数据,如果不存在此条数据,则受影响的行数为1。

最新的表数据如下:

id

name

age

1

Bruce

18

1.2 replace into

如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则先删除旧数据再插入最新的数据,例:

REPLACE INTO `person`(`name`, `age`) VALUES(‘Bruce’, 20);

– 2 row(s) affected

这里受影响的行数是2,因为数据库中存在name='Jack'的数据,并且id的值会变成2,因为它是先删除旧数据,然后再插入数据,最新的表数据如下:

id

name

age

2

Bruce

20

2. 避免重复插入(存在则忽略)

关键字/句:insert ignore into,如果插入的数据会导致UNIQUE索引或PRIMARY KEY发生冲突/重复,则忽略此次操作/不插入数据,例:

INSERT IGNORE INTO `person`(`name`, `age`) VALUES(‘Bruce’, 18);

– 0 row(s) affected

这里已经存在name='Bruce'的数据,所以会忽略掉新插入的数据,受影响行数为0,表数据不变。

4.三个复杂例子:

我们可以用customerMobile字段作为唯一索引(UNIQUE 索引)

Mapper类:

package com.example.springbootmybatisplusbruce.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.example.springbootmybatisplusbruce.model.E**Customer;import org.apache.ibatis.annotations.Param;import org.springframework.stereotype.Repository;import java.util.List;@Repositorypublic interface E**CustomerMapper extends BaseMapper<E**Customer> { /** * 不存在则插入,存在则更新 * on duplicate key update: 如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则执行UPDATE语句 * @param e**Customer * @return */ public int insertDuplicateKeyUpdate(E**Customer e**Customer); /** * replace into: 如果插入的数据会导致UNIQUE索引 或 PRIMARY KEY 发生冲突/重复,则先删除旧数据,再插入最新的数据 * @param etcCustomer * @return */ public int insertReplaceInto(E**Customer e**Customer); /** * 避免重复插入 * insert ignore into: 如果插入的数据会导致UNIQUE索引或PRIMARY KEY发生冲突/重复,则忽略此次操作/不插入数据 * @param e**Customer * @return */ public int insertIgnore(E**Customer e**Customer);}

xml文件:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.springbootmybatisplusbruce.mapper.E**CustomerMapper"> <resultMap type="com.example.springbootmybatisplusbruce.model.E**Customer" id="E**CustomerResult"> <result property="id" column="id" /> <result property="customerType" column="customer_type" /> <result property="customerName" column="customer_name" /> <result property="customerMobile" column="customer_mobile" /> ....................................................................... </resultMap> <sql id="selectE**CustomerVo"> select id, customer_type, customer_name, customer_mobile,...........................................................................from etc_customer </sql> <!-- 不存在则插入,存在则更新 --> <!-- on duplicate key update: 如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则执行UPDATE语句 --> <insert id="insertDuplicateKeyUpdate" parameterType="com.example.springbootmybatisplusbruce.model.E**Customer"> INSERT INTO e**_customer(id, customer_type, customer_name, customer_mobile, credential_type, credential_no, status, del_flag, create_by, create_time, update_by, update_time, remark) VALUES(#{id}, #{customerType}, #{customerName}, #{customerMobile}, #{credentialType}, #{credentialNo}, #{status}, #{delFlag}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{remark}) ON DUPLICATE KEY UPDATE <if test="customerType != null">customer_type=#{customerType},</if> <if test="customerName != null and customerName != ''">customer_name=#{customerName},</if> <if test="customerMobile != null and customerMobile != ''">customer_mobile=#{customerMobile},</if> <if test="credentialType != null">credential_type=#{credentialType},</if> <if test="credentialNo != null and credentialNo != ''">credential_no=#{credentialNo},</if> <if test="status != null">status=#{status}</if> </insert> <!-- replace into: 如果插入的数据会导致UNIQUE索引 或 PRIMARY KEY 发生冲突/重复,则先删除旧数据再插入最新的数据 --> <insert id="insertReplaceInto"> REPLACE INTO e**_customer(id, customer_type, customer_name, customer_mobile, credential_type, credential_no, status, del_flag, create_by, create_time, update_by, update_time, remark) VALUES(#{id}, #{customerType}, #{customerName}, #{customerMobile}, #{credentialType}, #{credentialNo}, #{status}, #{delFlag}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{remark}) </insert> <!-- 避免重复插入 --> <!-- insert ignore into: 如果插入的数据会导致UNIQUE索引或PRIMARY KEY发生冲突/重复,则忽略此次操作/不插入数据 --> <insert id="insertIgnore"> INSERT IGNORE INTO e**_customer(id, customer_type, customer_name, customer_mobile, credential_type, credential_no, status, del_flag, create_by, create_time, update_by, update_time, remark) VALUES(#{id}, #{customerType}, #{customerName}, #{customerMobile}, #{credentialType}, #{credentialNo}, #{status}, #{delFlag}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}, #{remark}) </insert></mapper>

service类:

package com.example.springbootmybatisplusbruce.service;import com.example.springbootmybatisplusbruce.mapper.ETCCustomerMapper;import com.example.springbootmybatisplusbruce.model.EtcCustomer;import org.apache.commons.io.FileUtils;import org.apache.commons.io.LineIterator;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.util.List;@Servicepublic class FTPFileParseService { @Autowired private E**CustomerMapper e**CustomerMapper; /** * 参考文章:https://blog.csdn.net/t894690230/article/details/77996355 * https://blog.csdn.net/weixin_45607513/article/details/117470118 * @throws IOException */ @Transactional(rollbackFor = Exception.class) public void fileParse() throws IOException { StringBuilder result = new StringBuilder(); String path = "F:\Digital marketing\E** system\txt-from-ftp\20210302_VEHICLE.txt"; long start = System.currentTimeMillis(); //程序执行前的时间戳 BufferedReader br = new BufferedReader(new FileReader(path));//构造一个BufferedReader类来读取文件 String line = null; while((line = br.readLine())!=null){//使用readLine方法,一次读一行// result.append(System.lineSeparator()+s); System.out.println("Debug:" + line); String [] infoArray = line.split("@~@"); EtcCustomer e**Customer = new EtcCustomer(); if(infoArray[0].isEmpty()){continue;} e**Customer.setId(Long.valueOf(infoArray[0]).longValue()); e**Customer.setCustomerType(Long.valueOf(infoArray[4]).longValue()); e**Customer.setCustomerName(infoArray[2]); e**Customer.setCustomerMobile(infoArray[3]); e**Customer.setCredentialType(Long.valueOf(infoArray[5]).longValue()); e**Customer.setCredentialNo(infoArray[6]); e**Customer.setStatus(Long.valueOf(infoArray[15]).longValue()); e**Customer.setDelFlag(0L); //on duplicate key update: 如果插入的数据会导致UNIQUE 索引或PRIMARY KEY发生冲突/重复,则执行UPDATE语句// e**CustomerMapper.insertDuplicateKeyUpdate(etcCustomer); //insert ignore into: 如果插入的数据会导致UNIQUE索引或PRIMARY KEY发生冲突/重复,则忽略此次操作/不插入数据 e**CustomerMapper.insertIgnore(etcCustomer); //replace into: 如果插入的数据会导致UNIQUE索引 或 PRIMARY KEY 发生冲突/重复,则先删除旧数据,再插入最新的数据// e**CustomerMapper.insertReplaceInto(etcCustomer); } br.close(); long end = System.currentTimeMillis(); //程序执行后的时间戳 System.out.println("程序执行花费时间:" + (end - start)); }}

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

本文链接地址:https://www.jiuchutong.com/zhishi/283499.html 转载请保留说明!

上一篇:最薄的平板电脑是什么(最薄的平板电脑是哪种)

下一篇:电脑硬盘跳线设置图解(硬盘跳线设置)

  • 小米10青春版支持的导航与定位有哪些(小米10青春版支持多少w快充)

    小米10青春版支持的导航与定位有哪些(小米10青春版支持多少w快充)

  • 快手通讯录好友指的是什么(快手通讯录好友和通讯录朋友区别)

    快手通讯录好友指的是什么(快手通讯录好友和通讯录朋友区别)

  • 酷我音乐账号注销失败(酷我音乐账号注销后手机号还能重新绑定吗)

    酷我音乐账号注销失败(酷我音乐账号注销后手机号还能重新绑定吗)

  • 钢化膜撕下来还能用吗(钢化膜撕下来还能用多久)

    钢化膜撕下来还能用吗(钢化膜撕下来还能用多久)

  • 20000w一小时多少度电(2200w一小时是多少度电)

    20000w一小时多少度电(2200w一小时是多少度电)

  • 点管理储存空间没反应(管理储存空间在哪里)

    点管理储存空间没反应(管理储存空间在哪里)

  • 小米笔记本连wifi不能上网(小米笔记本连wifi总显示不能用)

    小米笔记本连wifi不能上网(小米笔记本连wifi总显示不能用)

  • a92s有没有nfc(a92s有没有红外线)

    a92s有没有nfc(a92s有没有红外线)

  • 小米手环4上市时间(小米8手环功能介绍)

    小米手环4上市时间(小米8手环功能介绍)

  • 快手极速版一个手机号可以绑定两个账号吗(快手极速版一个微信可以绑定几个账号)

    快手极速版一个手机号可以绑定两个账号吗(快手极速版一个微信可以绑定几个账号)

  • 快捷复制是ctrl加什么(快捷复制是哪两个键)

    快捷复制是ctrl加什么(快捷复制是哪两个键)

  • 光纤信号灯闪烁红色(光纤信号灯闪烁是什么意思)

    光纤信号灯闪烁红色(光纤信号灯闪烁是什么意思)

  • ipad第六代是2018款吗(ipad第六代是2018还是2019)

    ipad第六代是2018款吗(ipad第六代是2018还是2019)

  • 主板电池没电了会出现什么情况(主板电池没电了怎么换)

    主板电池没电了会出现什么情况(主板电池没电了怎么换)

  • 小米手环4nfc卡包怎么用(小米手环4nfc手环卡住了怎么办)

    小米手环4nfc卡包怎么用(小米手环4nfc手环卡住了怎么办)

  • 2060 2070差距(2060和2070差距多少)

    2060 2070差距(2060和2070差距多少)

  • 微信注销后手机号可以绑定其他微信吗(微信注销后手机号会自动解绑吗)

    微信注销后手机号可以绑定其他微信吗(微信注销后手机号会自动解绑吗)

  • word中如何发邮件合并(如何在word上发邮件)

    word中如何发邮件合并(如何在word上发邮件)

  • 小米手环3怎么解绑手机(小米手环3怎么解绑)

    小米手环3怎么解绑手机(小米手环3怎么解绑)

  • oppo手机pcam00是什么型号(oppo手机型号pcem00是什么价位)

    oppo手机pcam00是什么型号(oppo手机型号pcem00是什么价位)

  • lcd和oled屏幕的区别(lcd和oled屏幕的优缺点)

    lcd和oled屏幕的区别(lcd和oled屏幕的优缺点)

  • 怎么恢复快手以前作品(怎么恢复快手以前删掉的作品)

    怎么恢复快手以前作品(怎么恢复快手以前删掉的作品)

  • 2021电赛F题智能送药小车方案分析(openMV数字识别,红线循迹,STM32HAL库freeRTOS,串级PID快速学习,小车自动返回)(电赛例题)

    2021电赛F题智能送药小车方案分析(openMV数字识别,红线循迹,STM32HAL库freeRTOS,串级PID快速学习,小车自动返回)(电赛例题)

  • 经典动画库 animate.css 的应用(经典动画动漫)

    经典动画库 animate.css 的应用(经典动画动漫)

  • vgremove命令  删除VG卷组设备(删除命令rm rf)

    vgremove命令 删除VG卷组设备(删除命令rm rf)

  • Dedecms织梦利用memberlist标签调用自定义模型中会员(织梦使用教程)

    Dedecms织梦利用memberlist标签调用自定义模型中会员(织梦使用教程)

  • 增值税抵扣了还能作废吗
  • 企业向银行贷款属于融资吗
  • 合同资产指的什么
  • 以前年度多计管账怎么做
  • 资源税类包括哪些税种
  • 水电费进项税额怎么抵扣
  • 企业不加入工会可以吗
  • 2019最新运输发票样本
  • 非税收入票据能报销吗
  • 向银行申请签发银行汇票的会计分录
  • 闲置设备折旧企业所得税税前扣除
  • 企业注销清算方案
  • 固定资产清理期末可以有余额吗
  • 融资购买无形资产例题
  • 无票收入申报时要填税率吗
  • 企业有美金收入吗
  • 企业所得税调增项目有哪些
  • 已经交税的收入退款会计分录
  • 实收资本取出来要交税吗?
  • 服务业工资计入成本还是营业费用
  • 国外公司怎么付款给国内
  • 小规模纳税人附加税减免政策2023
  • 物流公司通行票抵税比例是多少
  • 税种认定登记流程
  • 代扣代缴个人所得税手续费是否缴纳增值税
  • 加盟费怎么算的
  • 直接收款涉及增值税吗
  • 车位销售代理合同
  • 服务费发票可以部分红冲吗
  • window10主题的颜色浅了
  • 固定资产折旧方法的选择
  • win10电脑输入法不见了怎么恢复
  • 公司员工意外险怎么买
  • php readdir函数
  • 折扣销售的定义
  • php对接微信支付教程
  • 应付股利的会计分录T
  • 个人所得税如何计算
  • 含税价怎么计算增值税
  • 个人房屋出租税票怎么开
  • php最安全的登录功能
  • 三维重建是啥意思
  • 2022年 change detection遥感图像变化检测 论文附代码
  • java htmlparser
  • 增值税纳税申报表怎么填
  • 金蝶年底结账流程
  • 图书为什么不能退货
  • 制造费用和生产成本结转
  • 会计人员信息采集怎么填
  • 负债类科目有借贷方向吗
  • 财政借钱给预算单位的会计处理
  • 适用税率9%的征税行为有
  • access speed
  • 公司减少注册资本的条件和程序
  • 预付房租的账务处理
  • 以前年度损益调整结转到哪里
  • 暂估入库价格是否含税
  • 借应付职工薪酬贷财政拨款收入
  • 装修公司预收款要交增值税吗
  • 防伪税控服务费怎么交
  • 现金支票存根联和正联怎么盖章
  • 公司购买的礼品卡怎么做账
  • 股东借款转为资本公积的决议
  • 公司折价购买的股票
  • 股东分派现金股利怎么算
  • 主营业务收入的t型账户怎么写
  • 成本核算方法是移动加权平均法吗
  • mysql如何跨库查询
  • 卸载win+r
  • w7系统删除所有东西
  • cgi linux
  • win7把声音设备禁用了怎么要回来
  • win7玩穿越火线电脑应该怎么设置
  • 用python写网页
  • 在指定目录查找的文件
  • python脚本基本命令
  • javascript语言入门教程
  • jQuery 选择同时包含两个class的元素的实现方法
  • pageoffice控件安装不上
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设