情景如下:

  "今日前端忽然说句, 我需要做个判断, 不能重复收藏, 我犹如颈有寒冰不寒而栗, 于是思考我该怎么做?为什么她都思考到了我没有思考到这是我的工作啊"

  思考后得到三种解决方案:

    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 判断数据是否存在的更多相关文章

  1. mysql语句插入前判断数据是否重复

    在mysql中插入数据有时需要判断数据插入是否重复 语句编写:insert into 表(相应字段) select 相应字段 from dual where not exists (select 相应 ...

  2. MySQL INSERT插入条件判断:如果不存在则插入

    摘要: 我们经常需要进行sql的批量插入,要求:该条记录不存在则插入,存在则不插入.如果使用一条INSERT语句实现呢? 普通的 INSERT INTO 插入: INSERT INTO card(ca ...

  3. MySql安装与MySQL添加用户、删除用户与授权

    1.安装MySql       目前MySQL有两种形式的文件,一个是msi格式,一个是zip格式的.msi格式的直接点击setup.exe就好,按照步骤进行.但是很多人下了zip格式的解压发现没有s ...

  4. mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

    [CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...

  5. MySql插入记录时判断

    我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录. 这样的逻辑固然可以通过两条sql语句完成. SE ...

  6. (MariaDB/MySQL)之DML(1):数据插入

    本文目录: 1.insert和replace插入数据 1.1 insert into values() 1.2 insert into set 1.3 insert into select_state ...

  7. MySQL 第六篇:数据备份、pymysql模块

    一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1O8hXkdRK5_EVHZwNPwjCB ...

  8. mysql数据库补充知识4 数据备份和pymysql模块

    一 介绍 #注意: 批量加注释:ctrl+?键 批量去注释:ctrl+shift+?键 二 MySQL数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如W ...

  9. MySQL处理达到百万级数据时,如何优化?

    1.两种查询引擎查询速度(myIsam 引擎 ) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行. ...

随机推荐

  1. golang gc 优化思路以及实例分析

    一个即将上线的go 写的高频服务,压测的时候发现 gc 特别高,高到10%-15% 左右了,本文记录下优化 gc 的过程和和思路.线上环境1.10. 首先,查看gc 是否有异常,我们可以使用 gctr ...

  2. ie6遮罩层兼容 100%高度的实现

    .black { position:absolute;width:100%;height:100%;opacity:0.5;filter:alpha(opacity=50);background:#0 ...

  3. elementui常用知识点总结

    1.淡入淡出效果: <transition name="el-fade-in-linear"> <div v-show="show" clas ...

  4. Airlaunch 快捷设置代码分享

    Airlaunch 快捷设置代码分享设置:prefs:root=SETTING蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_IDWIFI:prefs:root=WIFI定位 ...

  5. 【神经网络】LSTM 网络

      Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息.LSTM 由Hochreiter & Schmidhuber (199 ...

  6. c#中日期格式化

    c#的日期格式化比较简单,在ToString中设置日期格式即可 DateTime.Now.ToLocalTime().ToString("yyyy_MM_dd_hh_mm_ss") ...

  7. NewStyleClass学习笔记[一]

    from : https://www.python.org/doc/newstyle/ New-style Classes Unfortunately(遗憾,不幸的), new-style class ...

  8. 基于jQuery全屏相册插件zoomVisualizer

    基于jQuery全屏相册插件zoomVisualizer.这是一款基于jquery ui实现的相册插件,支持隐藏显示相册缩略图,支持左右箭头切换图片,支持放大缩及缩小图片.效果图如下: 在线预览    ...

  9. Linux 增量系统备份和部分还原策略

    . . . . . 完全用 Linux 已经有快半年的时间了,一直想要全盘备份一下数据,但是却一直没有做,为什么呢? 一方面是东西比较多,备份一次要很长的时间:另一方面是一直在纠结用哪种方式备份比较好 ...

  10. [Socket]Socket进程间的通信

    转自:http://blog.csdn.net/giantpoplar/article/details/47657303 前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket ...