原文链接:https://blog.csdn.net/weixin_40533111/article/details/84137404 作者四月天五月雨^_^,转载请注明出处,谢谢

前言

本文介绍几种数据库SQL插入问题,如果存在该记录,则不操作或者执行更新,每种方式都有各自适应的场景,一一举例

目录:

1.虚表dual 加条件 not EXISTS
2.使用replace into
3.使用ON DUPLICATE KEY UPDATE
4.从其他表获取数据
5.设置唯一索引

正文:

1.虚表dual 加条件 not EXISTS

表现状:一张新建标签表tag,主键id自增,另外几个普通字段

现在有个 需求: 新插入一个标签, 要求item_key,item_value不能同时重复,否则不插入
选择: 首先排除4,接着排除3,5,因为普通列上没有设置索引,(可以设置唯一索引在两个列上,这样插入重复时,会索引重复导致失败,会抛出异常,如果频繁插入重复,损耗性能,不建议); 现有的标签在其他表中可能存在引用,故不能使用2的replace,综合考虑使用方式1

步骤:
使用虚表dual后跟条件 EXISTS,
eg:
insert into tag (category,item_key,item_value) select 'test1','key1','value1' from dual where NOT EXISTS (SELECT id FROM tag WHERE category='test1' and item_key='key1' and item_value='value1')

2.使用replace into

场景:如果确定存量的数据不重要,那么可以使用replace,简单高效,类似insert into的升级版,但操作的列必须存在唯一索引(主键包含唯一索引),
1 在三个列上加上unique索引(根据实际列数)

2.使用replace

replace  into tag (category,item_key,item_value)
values( 'test1','key1','value1' );

可以看到,id为1的那条记录被删除,之后又插入一条新纪录,id为1240;

3.使用ON DUPLICATE KEY UPDATE

需求:如果不存在则插入,存在则更新value键,进行加1(举例用的字符串,实际生产中可能是int),
DUPLICATE 命令需作用在有唯一索引的的列上,如果这列索引有重复则执行update,否则执行insert.

INSERT INTO tag (category,item_key,item_value) VALUES ('test1','key1','value1') ON DUPLICATE KEY UPDATE item_value='value_3';

4.从其他表获取数据

这点和题目不符了,算是个批处理

INSERT INTO tag (category,item_key,item_value)
SELECT category,item_key,item_value from tag_copy where id in(SELECT id from tag_copy where item_value like 'value%');

5.设置唯一索引

步骤可参考第三条,此处做点补充,因为是使用索引来控制插入不重复,那么有个问题,当索引重复时程序会异常,需要cache异常,而在批处理中,如果再使用这种高频度,性能不高的,应通过其他方式控制.



春水碧于天,画船听雨眠。

sql 如果不存在则插入,存在则不操作或修改相关推荐

  1. 这样在一个sql里完成更新和插入,只用一次数据库连接,效率提高了

    代码如下,请给出具体修改代码 public void AddCategory(string nCategoryName, int nImgId, int nBelongToId, int nShopI ...

  2. SQL Server:向 SQL Server 自增字段插入值 (转)

    SQL Server:向 SQL Server 自增字段插入值 [鹏城万里] 发表于 www.sqlstudy.com 通常情况下,不能向 SQL Server 自增字段插入值,如果非要这么干的话,S ...

  3. mybatis批量夺标添加_MyBatis+MySQL同时执行多条SQL,实现多表插入数据

    相信很多人都遇到过往Mybatis的Mapper.xml文件粘贴SQL的时候,因为多了一个';'而导致SQL报错的情形吧. 难道就不能执行多条SQL了么?其实是可以的.在分表的情况下,这种需求是强烈的 ...

  4. oracle+循环插入sql,SQL server,Oracle循环插入百万数据

    SQL server,Oracle循环插入百万数据 SQL server,Oracle循环插入百万数据 压测时常需要往数据库插入大量数据,下面是我往两个数据库插入数据时用的脚本 declare @ma ...

  5. CREATE VIEW SQL:通过SQL Server中的视图插入数据

    This is the third article in a series of learning the CREATE VIEW SQL statement. So far, I'd say tha ...

  6. 如何使用 SQL INSERT 语句将数据插入到表中

    文章目录 一.数据插入 1.1 插入完整的行 1.2 插入部分行 1.3 插入检索出的数据 二.从一个表复制到另一个表 三.小结 本文介绍如何使用 SQL INSERT 语句将数据插入到表中,如何用 ...

  7. SQL SERVER或者Oracle 数据库插入平方(²)立方(³)等特殊字符

    SQL SERVER或者Oracle 数据库插入平方(²)立方(³)等特殊字符 最近遇到一个奇葩的问题,客户非要保存20²,50³等这样的数据,但是到了数据库就变成202,503了 最后解决办法是: ...

  8. JDBC:软件架构、概述、数据库连接:普通项目添加jar包,URL、sql注入,类型转换,查询流程表、操作BLOB类型字段、批量插入,替换jar包、事务/数据库连接池

    0 常识说明 0.1 软件架构方式介绍 B/S架构:浏览器 与 服务器之间的交互. C/S架构:安装的本地软件(如:今日头条等) 与 服务器进行交互. 0.2 JavaWeb技术概览 JDBC核心技术 ...

  9. Mysql SQL语句执行更新或者插入添加条件判断

    Mysql SQL语句执行更新或者插入添加条件判断 – 更新操作 – INSERT INTO materials (ID,Name,Remaining,Total) VALUES (1,'SolidW ...

最新文章

  1. 计算机视觉开源库OpenCV之CommandLineParser使用方法
  2. HTTPS 工作原理和 TCP 握手机制
  3. SWOT分析是神马?
  4. linux和裸机的区别,操作系统与裸机的区别
  5. java多线程 cpu分配_java多线程总结(转载)
  6. python的pass语句_适用于pass语句的Python程序
  7. 系统程序员成长计划-走近专业程序员
  8. 怎样在ArcIMS 上实现专题图
  9. 【ElasticSearch】Es 源码之 PersistedClusterStateService 源码解读
  10. Python项目实践:BMI 身体质量指数
  11. OpenAI 发布模型实现自动定理证明,妈妈再也不用担心我的数学?
  12. Java各种日期计算
  13. mysql慢查询日志配置_MySQL 慢查询日志配置与简析
  14. 基于51单片机智能车流量检测车量统计系统设计
  15. 计算机基础知识教程表格日期,EXCEL设置自动生成特殊日期
  16. 傅里叶变换(时域频域)
  17. 360插件化踩坑记录(二),RePlugin安装、启动插件无反应
  18. Oracle表格误删,Oracle误删表空间文件
  19. 关于汇编语言中的立即寻址和直接寻址
  20. 产品经理究竟是干嘛的

热门文章

  1. 晨兴刘芹:避开同质化竞争 看好云适配技术创新
  2. ANT无线通信技术(1) 简介
  3. 磁场传感器(指北针)
  4. 计算机设置了桌面显示为什么没有反应,电脑开机后只显示桌面背景,图标没有,鼠标也没有反应,怎么办?...
  5. torch.manual_seed(seed)
  6. 南通大学计算机专业分数线2020,南通大学医学院2020年招生录取分数线
  7. vb.net 打印条形码code39、code128A、code128C、code128Auto(picturebox和打印机)封装类
  8. ABAC相关标准在数据服务中的应用——XACML和NGAC的比较
  9. Linux 如何查看内存使用情况
  10. 工作常用的工具类JS+reset.css