MySql中的有条件插入 insert where
假设现在我们有这样的需求:当数据库中不存在满足条件的记录时,可以插入一条记录,否则程序退出。该怎么实现?
1年以上工作经验的人应该都能立即想到:去检查一下库里有没有记录,没有就插入,有就结束。
int count = selectFromDb(); // ①
if count > 0 {
return;
} else {
insertIntoDb(); // ②
}
2年以上工作经验的在写完上面的逻辑后会立即发现:在并发场景下这样并不安全。如果两个线程同时执行到①这里,都会发现数据库没有记录,于是分别执行了②。所以在并发场景下,这里需要使用分布式锁。
int count = selectFromDb(); // ①
if count > 0 {
return;
} else {
try (getLock()) {// ③
count = selectFromDb(); // ④
if (count == 0) {
insertIntoDb(); // ②
}
}
}
这里在③处加了分布式锁,然后看一下的确没有数据再插入。
这篇文章要说的是使用数据库的sql执行机制来保证并发锁的实现。当然了,如果条件允许,使用唯一键冲突也是可以的。
在我们日常处理数据的时候,都是可以使用条件的,比如最简单的select where,最普通的update where等等。如果我们在插入的时候也可以使用where这个问题不就解决了吗。
当然了,正因为mysql没有提供这种语法,所以我们才在这里讨论这个问题。
mysql提供了根据已有数据来插入表的机制,就是非著名的insert select。所以我们的突破口就在这里,既然这里有select我们就在这里的select加where,因为insert select的实现是select不出东西的时候是不会插入的。
所以这里我们这样写
insert into t(id, c1, c2) select 1, "","" from dual where not exists (select * from t where c1="")
这里的where c1=""假设就是我们的条件①。
MySql中的有条件插入 insert where的更多相关文章
- mysql中如何不重复插入满足某些条件的重复的记录的问题
最近在项目中遇到了这样的一个问题“: 在mysql数据库中需要每次插入的时候不能插入三个字段都相同的记录.在这里使用到了 insert into if not exists 和insert igno ...
- MySQL 语句级避免重复插入—— Insert Select Not Exist
想要插入一条数据,要避免重复插入,又不想折腾两回数据库连接操作,可以参考如下办法. INSERT INTO table(column1,column2,column3 ...columnN) SELE ...
- (转载)mysql中百万级数据插入速度测试
(转载)http://www.111cn.net/database/mysql/42453.htm 100W的数据对于很多朋友来说算小菜了,但今天我就想到创建一个大量数据的测试环境,于是找了一下怎么插 ...
- Mysql 几种常见的插入 Insert into,Replace Into,Insert ignore
简要说下三者的区别:insert into 最普遍的插入,如果表中存在主键相同的数据,执行会报错. replace into 如果表中存在主键相同的数据则根据主键修改当前主键的数据,反之则插入(存在就 ...
- MySQL中的多表插入更新与MS-SQL的对比
MySQL多表插入: INSERT INTO tdb_goods_cates (cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_c ...
- MySQL中关于OR条件的优化
转载 MySQL在 5.0版本中引入新特性:索引合并优化(Index merge optimization),当查询中单张表可以使用多个索引时,同时扫描多个索引并将扫描结果进行合并. 该特新主要应用于 ...
- mysql中的if条件语句用法
· IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为expr2; ...
- mysql中如何不重复插入,mysql 重复的不插入,mysql唯一的插入
INSERT INTO new_schedules_spider_shipsname ( ID,SCAC,VESSEL,VOYAGE,SERVICE_NAME,MD5 ) SELECT NULL,%s ...
- mysql中增加某一时间段内的时间数据(包含:时间、年、月、日、第几周、季度)
创建表dim_date: create table `dim_date` ( `year` int (20), `month` int (20), `day` int (20), `week` int ...
随机推荐
- 一篇彻底理解JS中的prototype、__proto__与constructor
1.基本类型不是对象(boolean.undefined.number.string) 2.引用类型都是对象(Array,function ,Object) 3.对象是通过函数创建,并且强调,对象字面 ...
- Deep Learning with Differential Privacy
原文链接:Deep Learning with Differential Privacy abstract:新的机器学习算法,差分隐私框架下隐私成本的改良分析,使用非凸目标训练深度神经网络. 数学中最 ...
- maven打包package时出现错误
Some problems were encountered while building the effective model for com.ecjtu:adopt:war:1.0-SNAPSH ...
- git-服务器搭建-协议概念
现在开发过程中,很多的实现某一些功能的工具,都是类似的服务器-客户端结构,即C-S架构,例如消息队列的KAFKA,文件存储的EasticSearch,包括我们日常工作中的数据库,他都是一种C-S架构, ...
- apt-get could not get lock /var/lib/dpkg/lock报错
用apt-get命令安装一些软件包时,报这个错 could not get lock /var/lib/dpkg/lock 出现这个问题的原因可能是有另外一个程序正在运行,导致资源被锁不可用.而导致资 ...
- 初始化CentOS7
安装CentOS7 配置网络 # 修改网络配置 vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE="Ethernet" PROX ...
- 配置OSPF与BFD联动
组网图形 OSPF与BFD联动简介 双向转发检测BFD(Bidirectional Forwarding Detection)是一种用于检测转发引擎之间通信故障的检测机制.BFD对两个系统间的.同一路 ...
- Peomise
什么是promise 简单回答: 一种异步的解决方案 回顾一下什么是异步 事件 / setTimeout 异步执行的时机 同步->异步微任务->GUI渲染->异步宏任务 #为 ...
- AddressSanitizer —— ASAN分析内存错误
简介 AddressSanitizer 是一个性能非常好的C/C++ 内存错误探测工具. 它由编译器的插桩模块和替换了malloc函数的运行时库组成. 这个工具可以探测如下这些类型的错误: 对堆.栈和 ...
- 跟我一起学Redis之高可用从主从复制开始
前言 现在遇到高并发场景时,缓存技术应该算是性能优化的第一步,缓解数据库压力的同时还能提高访问效率,而Redis应该是绝大多数应用场景的首选.但是尽快Redis性能再优秀,在当今高并发场景下,一台服务 ...