mysql insert exists || mysql 判断数据是否存在
情景如下:
"今日前端忽然说句, 我需要做个判断, 不能重复收藏, 我犹如颈有寒冰不寒而栗, 于是思考我该怎么做?为什么她都思考到了我没有思考到这是我的工作啊"
思考后得到三种解决方案:
1. 两条sql, 然后通过第一条sql判断
2. 一条sql, insert 中使用exists方式(暂时不会,下面讲解)
3. 存储过程
后请教公司一同事,得到结论, 如果是两个客户端同时操作就采用存储过程, 如果不是, 那么第一种第二种都ok, 后决定采用方案2
- INSERT INTO table(column1,column2,column3 ...columnN)
- SELECT value1,value2,value3 ...valueN
- FROM dual
- WHERE NOT EXISTS(
- SELECT *
- FROM table
- WHERE value = ?
- );
sql结构
- INSERT INTO content (
- detail,
- status,
- beginTime,
- endTime)
- SELECT
- @detail,
- ,
- NULL,
- NULL
- FROM DUAL
- WHERE NOT EXISTS(
- SELECT contentId
- FROM content
- WHERE detail=@detail);
sql示例
dual是为了构建查询语句而存在的表,Oracle中很常见,配合INSERT ... SELECT构建成我们需要的表,并指定了数据项.
EXISTS通过这个判断是否存在的函数,就免去了我们做IF-ELSE的冗繁操作
判断一条数据是否存在, 如果存在,就修改update;如果不存在, 就添加insert
那么如果这样,一般情况下,我就要发出三条sql,第一条sql查询这条记录,然后用程序判断,如果存在,则更新,如果不存在,则插入。
但是这样,就略显麻烦了,而且要发出三条sql,那么,其实是有办法一次性解决的。
解决办法是用存储过程
- BEGIN
- -- 定义一个变量来保存该记录是否存在
- declare num int;
- -- 这条sql,就是查询对应的记录有多少条,注意 into num 这两句话,就是把count(*) 查出的值,赋给到num中
- select count(*) into num from t_count_view where TO_DAYS(now())=TO_DAYS(day);
- -- 接下来的就是判断了,注意,判断是否等于,只有一个等于号
- if(num=)
- -- 等于号之后,还要写一个Then,代表条件成立后要执行的sql
- Then
- insert into t_count_view(view_people,view_num,day)values(,,now());
- -- else可以直接用,不需要加then
- else
- update t_count_view set view_people=view_people+;
- -- 但是当if使用完之后,一定要写end if,代表着if的条件判断结束了
- end if;
- END
存储过程
发现自己的sql还有漫长的路要走...
mysql insert exists || mysql 判断数据是否存在的更多相关文章
- mysql语句插入前判断数据是否重复
在mysql中插入数据有时需要判断数据插入是否重复 语句编写:insert into 表(相应字段) select 相应字段 from dual where not exists (select 相应 ...
- MySQL INSERT插入条件判断:如果不存在则插入
摘要: 我们经常需要进行sql的批量插入,要求:该条记录不存在则插入,存在则不插入.如果使用一条INSERT语句实现呢? 普通的 INSERT INTO 插入: INSERT INTO card(ca ...
- MySql安装与MySQL添加用户、删除用户与授权
1.安装MySql 目前MySQL有两种形式的文件,一个是msi格式,一个是zip格式的.msi格式的直接点击setup.exe就好,按照步骤进行.但是很多人下了zip格式的解压发现没有s ...
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...
- MySql插入记录时判断
我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录. 这样的逻辑固然可以通过两条sql语句完成. SE ...
- (MariaDB/MySQL)之DML(1):数据插入
本文目录: 1.insert和replace插入数据 1.1 insert into values() 1.2 insert into set 1.3 insert into select_state ...
- MySQL 第六篇:数据备份、pymysql模块
一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1O8hXkdRK5_EVHZwNPwjCB ...
- mysql数据库补充知识4 数据备份和pymysql模块
一 介绍 #注意: 批量加注释:ctrl+?键 批量去注释:ctrl+shift+?键 二 MySQL数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如W ...
- MySQL处理达到百万级数据时,如何优化?
1.两种查询引擎查询速度(myIsam 引擎 ) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行. ...
随机推荐
- hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...
- FFmpeg(7)-av_read_frame()读取帧数据AVPacket和av_seek_frame()改变播放进度
一.av_read_frame() 该函数用于读取具体的音/视频帧数据 int av_read_frame(AVFormatContext *s, AVPacket *pkt); 参数说明: AVFo ...
- 【线程】linux之thread错误解决方案
1.错误现象: undefined reference to 'pthread_create' undefined reference to 'pthread_join' 2.问题原因: pt ...
- 解决IntelliJ IDEA控制台乱码问题[包含程序运行时的log4j日志以及tomcat日志乱码]
这里使用的IntelliJ IDEA版本为[IntelliJ IDEA 14.1.4]: 一.控制台打印的程序运行时的log4j日志中包含中文乱码 在IDEA安装目录的bin目录下找到名为" ...
- recv用TCP和TUDP下的区别
recv是可以用在UDP套接字上的,前提是该套接字调用过bind或者connect,那它用在TCP和UDP套接字上时有什么区别呢? 下面做一个测试,分别使用UDP.TCP实现一对C/S.客户端发送12 ...
- 系统清理工具CCleaner被植入后门
概述 2017年9月18日,有情报披露,著名的系统优化工具CCleaner的某个版本被发现植入后门,大量使用该工具的用户恐将面临泄密风险.这是继Xshell后门事件后,又一起严重的软件供应链来源攻击事 ...
- iOSUIPickerView使用
#import <UIKit/UIKit.h> @interface ViewController : UIViewController<UIPickerViewDelegate,U ...
- python 6种数据类型几及用法
#!/usr/bin/python3 #python的基本语法和数据类型 #python3中 一行有多个语句,用分号分割(;) print("aaa") ;print(" ...
- Android Toolbar的使用 顶部标题栏+后退键
最近设计安卓里面有个标题栏,里面有个后退键,可以完成后退之类的功能. 好,刚好可以用Toolbar去实现 上代码:activity_main.xml <?xml version="1. ...
- Android GridView的使用页面按钮
GridView(网格视图),用来显示网格,用来显示一些按钮比较好用. 上代码吧. 主页面:activity_main.xml 添加一个GridView用来显示按钮的列表 <?xml versi ...