sql 如果不存在则插入,存在则不操作或修改
原文链接: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 如果不存在则插入,存在则不操作或修改相关推荐
- 这样在一个sql里完成更新和插入,只用一次数据库连接,效率提高了
代码如下,请给出具体修改代码 public void AddCategory(string nCategoryName, int nImgId, int nBelongToId, int nShopI ...
- SQL Server:向 SQL Server 自增字段插入值 (转)
SQL Server:向 SQL Server 自增字段插入值 [鹏城万里] 发表于 www.sqlstudy.com 通常情况下,不能向 SQL Server 自增字段插入值,如果非要这么干的话,S ...
- mybatis批量夺标添加_MyBatis+MySQL同时执行多条SQL,实现多表插入数据
相信很多人都遇到过往Mybatis的Mapper.xml文件粘贴SQL的时候,因为多了一个';'而导致SQL报错的情形吧. 难道就不能执行多条SQL了么?其实是可以的.在分表的情况下,这种需求是强烈的 ...
- oracle+循环插入sql,SQL server,Oracle循环插入百万数据
SQL server,Oracle循环插入百万数据 SQL server,Oracle循环插入百万数据 压测时常需要往数据库插入大量数据,下面是我往两个数据库插入数据时用的脚本 declare @ma ...
- 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 ...
- 如何使用 SQL INSERT 语句将数据插入到表中
文章目录 一.数据插入 1.1 插入完整的行 1.2 插入部分行 1.3 插入检索出的数据 二.从一个表复制到另一个表 三.小结 本文介绍如何使用 SQL INSERT 语句将数据插入到表中,如何用 ...
- SQL SERVER或者Oracle 数据库插入平方(²)立方(³)等特殊字符
SQL SERVER或者Oracle 数据库插入平方(²)立方(³)等特殊字符 最近遇到一个奇葩的问题,客户非要保存20²,50³等这样的数据,但是到了数据库就变成202,503了 最后解决办法是: ...
- JDBC:软件架构、概述、数据库连接:普通项目添加jar包,URL、sql注入,类型转换,查询流程表、操作BLOB类型字段、批量插入,替换jar包、事务/数据库连接池
0 常识说明 0.1 软件架构方式介绍 B/S架构:浏览器 与 服务器之间的交互. C/S架构:安装的本地软件(如:今日头条等) 与 服务器进行交互. 0.2 JavaWeb技术概览 JDBC核心技术 ...
- Mysql SQL语句执行更新或者插入添加条件判断
Mysql SQL语句执行更新或者插入添加条件判断 – 更新操作 – INSERT INTO materials (ID,Name,Remaining,Total) VALUES (1,'SolidW ...
最新文章
- 计算机视觉开源库OpenCV之CommandLineParser使用方法
- HTTPS 工作原理和 TCP 握手机制
- SWOT分析是神马?
- linux和裸机的区别,操作系统与裸机的区别
- java多线程 cpu分配_java多线程总结(转载)
- python的pass语句_适用于pass语句的Python程序
- 系统程序员成长计划-走近专业程序员
- 怎样在ArcIMS 上实现专题图
- 【ElasticSearch】Es 源码之 PersistedClusterStateService 源码解读
- Python项目实践:BMI 身体质量指数
- OpenAI 发布模型实现自动定理证明,妈妈再也不用担心我的数学?
- Java各种日期计算
- mysql慢查询日志配置_MySQL 慢查询日志配置与简析
- 基于51单片机智能车流量检测车量统计系统设计
- 计算机基础知识教程表格日期,EXCEL设置自动生成特殊日期
- 傅里叶变换(时域频域)
- 360插件化踩坑记录(二),RePlugin安装、启动插件无反应
- Oracle表格误删,Oracle误删表空间文件
- 关于汇编语言中的立即寻址和直接寻址
- 产品经理究竟是干嘛的
热门文章
- 晨兴刘芹:避开同质化竞争 看好云适配技术创新
- ANT无线通信技术(1) 简介
- 磁场传感器(指北针)
- 计算机设置了桌面显示为什么没有反应,电脑开机后只显示桌面背景,图标没有,鼠标也没有反应,怎么办?...
- torch.manual_seed(seed)
- 南通大学计算机专业分数线2020,南通大学医学院2020年招生录取分数线
- vb.net 打印条形码code39、code128A、code128C、code128Auto(picturebox和打印机)封装类
- ABAC相关标准在数据服务中的应用——XACML和NGAC的比较
- Linux 如何查看内存使用情况
- 工作常用的工具类JS+reset.css