位置: 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 转载请保留说明!

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

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

  • 关于推广个人博客的经验 (推广博文)

    关于推广个人博客的经验 (推广博文)

  • cad正版和盗版的区别(cad正版和盗版的差别)

    cad正版和盗版的区别(cad正版和盗版的差别)

  • qq注销账号后游戏数据还在吗(qq注销账号后游戏还在吗)

    qq注销账号后游戏数据还在吗(qq注销账号后游戏还在吗)

  • 小米6相册图标不见了(小米相册图标不见了怎么办)

    小米6相册图标不见了(小米相册图标不见了怎么办)

  • 一加8发布会在几月(一加8系列发布会)

    一加8发布会在几月(一加8系列发布会)

  • 爱奇艺绑定身份证更换(爱奇艺绑定身份证号怎么解除)

    爱奇艺绑定身份证更换(爱奇艺绑定身份证号怎么解除)

  • hp1110打印机无法打印(hpdj1110打印机错误不打印)

    hp1110打印机无法打印(hpdj1110打印机错误不打印)

  • 乐外手环app叫什么(乐外手环app叫什么名字)

    乐外手环app叫什么(乐外手环app叫什么名字)

  • 云文档是什么意思(云文档是什么意思为什么都能看到)

    云文档是什么意思(云文档是什么意思为什么都能看到)

  • 地暖温控器突然不亮了(地暖温控器突然不亮了什么原因)

    地暖温控器突然不亮了(地暖温控器突然不亮了什么原因)

  • 苹果电脑没有鼠标怎么右键(苹果电脑没有鼠标怎么操作)

    苹果电脑没有鼠标怎么右键(苹果电脑没有鼠标怎么操作)

  • 国产操作系统能不能安装到目前的电脑(国产操作系统能打败微软吗)

    国产操作系统能不能安装到目前的电脑(国产操作系统能打败微软吗)

  • 手机支付宝余额支付功能怎么开启(手机支付宝余额变动明细怎么删除)

    手机支付宝余额支付功能怎么开启(手机支付宝余额变动明细怎么删除)

  • realmex2pro怎么打开网络共享(realmex2手机)

    realmex2pro怎么打开网络共享(realmex2手机)

  • 被淘宝删除评价的后果(被淘宝删除评价多久会变健康宝宝)

    被淘宝删除评价的后果(被淘宝删除评价多久会变健康宝宝)

  • vsco免费还是付费(vsco不是免费的吗)

    vsco免费还是付费(vsco不是免费的吗)

  • 手机酷狗怎么显示全歌词(手机酷狗怎么显示桌面歌词)

    手机酷狗怎么显示全歌词(手机酷狗怎么显示桌面歌词)

  • 手机自动充电在哪设置(手机自动充电在哪里设置)

    手机自动充电在哪设置(手机自动充电在哪里设置)

  • 大华摄像头复位键在哪(大华摄像头复位键的作用)

    大华摄像头复位键在哪(大华摄像头复位键的作用)

  • vivox9怎么关闭低电量模式(vivox7手机怎么关闭低电量模式)

    vivox9怎么关闭低电量模式(vivox7手机怎么关闭低电量模式)

  • 做PR做了八年,应该放弃PR转MKT吗?(pr可以做后期吗)

    做PR做了八年,应该放弃PR转MKT吗?(pr可以做后期吗)

  • jsnaloo是什么型号(jsnan什么意思)

    jsnaloo是什么型号(jsnan什么意思)

  • 7pro是什么手机(7pro参数)

    7pro是什么手机(7pro参数)

  • 华为最近删除视频在哪(华为最近删除视频变迷糊)

    华为最近删除视频在哪(华为最近删除视频变迷糊)

  • wps文档怎么换行打字(电脑wps文档没保存怎么找回)

    wps文档怎么换行打字(电脑wps文档没保存怎么找回)

  • 开了移动数据不能上网(开移动数据不用会变少吗)

    开了移动数据不能上网(开移动数据不用会变少吗)

  • aptio setup解决步骤(aptio setup解决步骤 2017)

    aptio setup解决步骤(aptio setup解决步骤 2017)

  • 使用ffmpeg把mp4与m3u8相互转换的操作(ffmpeg png to mp4)

    使用ffmpeg把mp4与m3u8相互转换的操作(ffmpeg png to mp4)

  • 增值税发票抵扣是什么意思
  • 增值税留抵注销时怎么办
  • 城镇土地使用税的征税范围有哪些
  • 固定资产清理哪方登记增加
  • 发票遗失重开需要收费吗
  • 房租 收入
  • 委托付款税务认可吗
  • 房地产企业配套设施的核算内容
  • 企业间资金往来 人员派驻
  • 增值税缴纳的罚款怎么算
  • 产品置换广告费
  • 企业对外投资需要注意的事项
  • 当月增次月是什么意思
  • 油票发票可以抵进项税吗
  • 个体工商户税种认定的税目可以改吗
  • 用于集体福利的进项税额转出
  • 9个点的税率有哪些
  • 权益净利率如何提高
  • 如何在win7系统中查看电脑基本信息
  • window102020年最新版本
  • ubuntu18.04 u盘安装
  • 会计中在建工程与建筑安装工程的区别
  • deepin正式版
  • 工作组只能看到自己
  • wordpresswiki
  • php自定义字段
  • php的变量
  • 特许权使用费属于无形资产吗
  • 增值税专用发票丢了怎么补救
  • php将数据导出到excel
  • phpforeach
  • 负债大于资产是逆差还是顺差
  • PHP isset()与empty()的使用区别详解
  • php curl_init
  • linux杀死程序
  • 替票报销违法吗
  • three.js 入门
  • 税票电子发票怎么开
  • 安全生产责任险是强制险吗
  • dedecms怎么改图片
  • MYSQL ERROR 1045 (28000): Access denied for user (using password: YES)问题的解决
  • 摄影的服务注册是什么
  • 专用发票什么意思
  • 新建厂房的费用怎么算
  • 交易性金融资产公允价值变动怎么算
  • 应交税金包括哪些税费
  • 盈余公积分配现金股利会影响留存收益吗
  • 贷款转入账号
  • 应收票据背书转让购买原材料
  • 专项费用会计分录
  • 关联公司之间的借款
  • 一般纳税人进货的会计分录怎么做
  • 流动比率怎么算出来的
  • sqlserver界面
  • mysql压测调优
  • fedora怎么样
  • win10禁用所有启动项
  • [视频]看科学家如何将纯净水变成金属
  • Windows Server 2003关闭启动后的Ctrl+Alt+Del选项和关机时的时间跟踪程序方法
  • linux如何安装rz和sz
  • macair蓝牙用不了
  • xp系统如何取消开机自动启动程序
  • win7彻底删除的文件怎么恢复
  • win7系统回收站文件夹的位置
  • win7修改用户密码命令
  • win8.1system磁盘占用率高
  • d命令怎么用
  • python列表详解
  • cocos2d android
  • 噩梦剧情
  • shell脚本ne
  • nodejs开发微信小程序
  • js定时器有哪些,区别及用法
  • 在谈到民族这个概念是我们一再指出
  • jqueryon事件
  • python中用户登录
  • 江苏国税电子税务局网上申报流程
  • 无经营公司
  • 机动车发票怎样开
  • 国税优盘安装教程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设