1. 业务场景

针对一些基础业务数据如用户表,要保证主键Primary或Unique不重复,如果在插入时做判断,效率低且代码复杂。

2. 实现方案

基于MySQL数据库,实现方案有如下4种

  • replace into 使用最简单,推荐
  • on duplicate key update 可以根据业务需要,当数据重复时,指定更新的内容。有对应使用场景时使用
  • insert ignore into 简单粗暴,可能会丢数据,不推荐
  • 实现的功能类似于insert ingore into, 且使用复杂,不推荐

创建测试表

drop table user;
CREATE TABLE user (id int(20) unsigned NOT NULL AUTO_INCREMENT,name varchar(10) DEFAULT NULL,mobile varchar(20) DEFAULT NULL,PRIMARY KEY (id),unique index idx_name (name) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;insert into user(name,mobile) values('张三','13578901288');

2.1. replace into

replace into 跟 insert 功能类似,不同点在于:replace into 首先尝试插入数据到表中,

  1. 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
  2. 否则,直接插入新数据。
replace into user(name,mobile) values('张三','13578901234');
replace into user set name='张三',mobile='13578901236';

注意:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。

MySQL replace into 有三种形式:

  1. replace into tbl_name(col_name, …) values(…)

  2. replace into tbl_name(col_name, …) select …

  3. replace into tbl_name set col_name=value, …

  • 第一种形式类似于insert into的用法,
  • 第二种replace select的用法也类似于insert select,这种用法并不一定要求列名匹配,事实上,MYSQL甚至不关心select返回的列名,它需要的是列的位置。例如,replace into tb1( name, title, mood) select rname, rtitle, rmood from tb2;
    这个例子使用replace into从tb2中将所有数据导入tb1中, tb2与tb1的字段名不同。
  • 第三种replace set用法类似于update set用法,使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。

前两种形式用的多些。其中 “into” 关键字可以省略,不过最好加上 “into”,这样意思更加直观。另外,对于那些没有给予值的列,MySQL 将自动为这些列赋上默认值。

2.2. on duplicate key update

先执行insert语句,当出现primary或者unique冲突时执行update语句,update语句则是需要更新的内容:使用新值替换数据库中的值
如示例,当用户名称冲突时,更新用户的手机号码。

insert into user(name,mobile) values('张三','13578901235') on duplicate key update mobile='13578901235';

注意:插入数据的表必须有主键或者是唯一索引!否则的话会直接插入数据,这将导致表中出现重复的数据。

2.3. insert ignore into

当执行insert to出现冲突时不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则可能导致数据丢失

insert ignore into user(name,mobile) values('张三','13578901234');

2.4. insert … select … where not exist

根据select语句的条件判断是否插入,不需要插入数据的表必须有主键或者是唯一索引。示例如下:
但select语句的条件

INSERT INTO user (name,mobile) SELECT '王五','13578901236' FROM dual WHERE NOT EXISTS (SELECT name FROM user WHERE name = '王五')

MySQL 插入数据时如何不插入重复的数据相关推荐

  1. navicat还原mysql备份数据时,部分表无数据

    最近在使用navicat正在本地恢复数据时,发现部分表数据,百度一下,发现是由于max_allowed_packed设置过小,而insert时数据过多导致出错,修改max_allowed_packed ...

  2. mysql中用于删除数据的是什么意思_在删除关系表中数据时,要先删除主表数据再删除从表数据。_学小易找答案...

    [单选题]在MySQL中,所有存储过程的信息存放在下列哪个数据库中 [填空题]拉伸试验能测定的塑性指标有: 和 . [单选题]下面查看视图的基本信息的语句中,正确的是 [单选题]下面关于视图建立的说法 ...

  3. 使用hibernate的this.getSession().createSQLQuery(sql).list();方法查询数据时出现查到的数据和想象的不一致,很是郁闷,诡异...

    今天 使用hibernate的this.getSession().createSQLQuery(sql).list();方法查询数据时出现查到的数据和想象的不一致的问题,郁闷我很长一段时间 执行的方法 ...

  4. Mysql插入中文时提示:ERROR 1366 (HY000): Incorrect string value: '\xE5\x8F\xB0\xE5\xBC\x8F...' fo

    Mysql插入数据时提示:ERROR 1366 (HY000): Incorrect string value: '\xE5\x8F\xB0\xE5\xBC\x8F-' fo 分析如下: 首先通过语句 ...

  5. MySQL 插入、更新与删除表中数据

    文章目录 ↠前言↞ ↻ . 准备工作 1)使用数据库 2)创建数据表 3)查看数据表是否存在 4)查看数据表信息 (两种方法) ㊀ . 插入数据 第一种添加方法 第二种添加方法 第三种添加方法 第四种 ...

  6. 更新数据时redis缓存与数据库数据不一致的问题

    最初级的缓存不一致问题及解决方案 问题:先修改数据库,再删除缓存.如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致. 解决思路:先删除缓存,再修改数据库.如果数据库修 ...

  7. mysql创建表时默认默认_mysql创建数据表时指定默认值教程

    指定默认值 如果在插入行时没有给出值,MySQL允许指定此时使用的默认值.默认值用 CREATE TABLE 语句的列定义中的 DEFAULT 关键字指定. 请看下面的例子: 输入:create ta ...

  8. jdbc mysql 成功 spring mysql 失败_java Spring 的JDBCTemplet批量入库数据时如果有一条数据入库不成功,其他的数据还会入库吗...

    展开全部 在我们的项32313133353236313431303231363533e59b9ee7ad9431333363373639目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客 ...

  9. 触发器-当表1插入数据时将表1的数据插入表2

    --触发器学习 ALTER trigger 触发器名 on 表1 for insert as begin if (select count(1) from 表1)=0 print '未插入数据' el ...

最新文章

  1. ASFNU SC Day6
  2. Python实例浅谈之三Python与C/C++相互调用
  3. Scalaz(23)- 泛函数据结构: Zipper-游标定位
  4. 克隆虚拟机加入域遇到的相同SID问题解决。。。
  5. Phalcon和YII的优点
  6. python upper()函数和lower()函数(返回字符串中字母的大[小]写)(大写、小写)
  7. Go -- php 中的pack(H*, $string) 转换成go
  8. oracle中的new old 关键字
  9. C中遇到错误error: jump to label [-fpermissive]的解决办法
  10. LIVE MINI ESP32开发板教程系列(四)NeoPixel + ws2812b实现炫彩显示
  11. http请求过程:一,DNS域名解析系统详解
  12. c语言高级编辑器,选项,文本编辑器,C/C++,高级
  13. 5G+工业互联网发展探讨
  14. 编译和执行区别 c语言,C语言编译和执行分析
  15. Spark2.3.2源码解析: 5. SparkConf源码分析
  16. apache 编译java_关于apache的bsf包的JavaUtils工具类包自定义类编译器对指定目标文件进行编译JDKcompile...
  17. oracle故障分析报告,Oracle 数据库异常宕机错误分析:ORA-01092
  18. 使用腾讯移动应用安全(原乐固)加固安卓APK
  19. 基于Pyinstaller库将Python项目包括 图片打包exe方法,本人已经实践多次
  20. 身家破亿!86版西游记“红孩儿”拒绝出道成学霸,已是中科院博士,名下52家公司...

热门文章

  1. 飞信如何设置不用手机接收短信
  2. 【samba】Wodows同步Linux文件|搭建共享文件服务器——在windows上映射网络驱动器
  3. pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Microsoft Office Excel', 'Excel 无法打开文件“
  4. C语言输入,输出那些事
  5. 程序员的自我修炼---小白成长历程
  6. uva1220Party at Hali-Bula(树形dp)
  7. Scala学习(八)模式匹配
  8. 《华林科纳-半导体工艺》硅的化学刻蚀
  9. 大话西游2服务器修改,【独家】大话西游一键端单机服务端+GM工具+修改教程
  10. 12,桥接模式-露娜的召唤师技能