我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录。

这样的逻辑固然可以通过两条sql语句完成。

SELECT COUNT(*) FROM xxx WHERE ID=xxx;

if (x == 0)

INSERT INTO xxx VALUES;

else

UPDATE xxx SET ;

但是这样操作在性能上有所损失, 代码结构感觉有点丑陋。

其实MySQL提供了可以在一个SQL语句中完成上述逻辑的支持。

官方文档如下:

MySQL provides many extentions to SQL which help performance in many

common use scenarios. Among these are INSERT … SELECT, INSERT … ON

DUPLICATE KEY UPDATE, and REPLACE.

I rarely hesitate to use the above since they are so convenient and

provide real performance benefits in many situations. MySQL has other

keywords which are more dangerous, however, and should be used

sparingly. These include INSERT DELAYED, which tells MySQL that it is

not important to insert the data immediately (say, e.g., in a logging

situation). The problem with this is that under high load situations

the insert might be delayed indefinitely, causing the insert queue to

baloon. You can also give MySQL index hints about which indices to

use. MySQL gets it right most of the time and when it doesn’t it is

usually because of a bad scheme or poorly written query.

重要的就是上面提到的 :

INSERT ... SELECT

INSERT ... ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE REPLACE

比如想往表中插入一条数据,如果表中没有该条数据才插入,如果已经存在该条数据就不插入。

首先,在创建表时,将不需要重复的字段设置为unique,然后在插入时,使用insert ignore语句。

例如:(数据库用的是mysql5)

创建一张表用来存储用户:

create table user_info ( uid mediumint(10) unsigned NOT NULL auto_increment primary key, last_name char(20) not null, first_name char(20) not null, unique ( last_name, first_name) );

alter table anser add UNIQUE (last_name,first_name)

插入数据:

insert ignore into user_info (last_name,first_name) values ('x','y');

这样一来,如果表中已经存在last_name=’x’且first_name=’y’的数据,就不会插入,如果没有就会插入一条新数据。

上面的是一种用法, 也可以用 INSERT …. SELECT 来实现。

mysql 检查记录存在_Mysql 插入记录时检查记录是否已经存在,存在则更新,不存在则插入记录SQL...相关推荐

  1. mysql sum 重复计算_mysql join sum时数据重复问题及解决方案

    当我们使用mysql的join功能从多张表中取出数据并使用sum分别对取出的数据求和时 会发现sum出来的值是不对的,往往是正确值的整数倍 为什么会出现这样的情况呢 复现 假设有两张表:user_bu ...

  2. 如何增加mysql主键约束_mysql修改表时怎么添加主键约束?

    mysql中可以通过"ALTER TABLE 表名 ADD PRIMARY KEY(字段名);"语句在修改数据表时添加主键约束:当在修改表时要设置表中某个字段的主键约束时,要确保设 ...

  3. mysql 判断 字母大写_MySQL中查询时对字母大小写的区分

    我相信很多人在mysql中查询时都遇到过mysql不区分字母大小写的情况:如以下例子: 1.SELECT * FROM `user` WHERE userpass = 'Z20'; 结果为: 2.SE ...

  4. mysql 查找小写字母_MySQL中查询时对字母大小写的区分

    我相信很多人在mysql中查询时都遇到过mysql不区分字母大小写的情况:如以下例子: 1.SELECT * FROM `user` WHERE userpass = 'Z20'; 结果为: 2.SE ...

  5. mysql特殊字符无法入库_MySQL数据入库时特殊字符处理详解

    在一个字符串中,如果某个序列具有特殊的含义,每个序列以反斜线符号 ("")开头,称为转义字符. MySQL 识别下列转义字符: 0 一个 ASCII 0 (NUL) 字符. ' 一 ...

  6. mysql清除旧版本_MYSQL使用INNODB时及时清理旧版本数据

    InnoDB's tablespace can grow very large in a writeheavy environment. If transactions stay open for a ...

  7. mysql根据时间回退_MySQL 中的日期时间类型

    日期时间类型中包含以下几种数据类型: 各类型都有具体的取值范围,超出或非法的其他值时,MySQL 会回退到 0.TIMESTAMP 类型是个例外,给它设置一个超出范围的值时,将保存上该类型允许的最大值 ...

  8. mysql 体重 类型 身高_MySQL 数据类型

    介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 mysql常用数据类型概括: #1. 数字: 整型:tinyint int bigint 小 ...

  9. Dubbo ---- 启动时检查-直连提供者

    Dubbo - 直连提供者 在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连, 点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表, A接口配置点对点 ...

  10. mybatis jdbctype oracle number,mybatis 插入null 时需要指定jdbcType

    MyBatis 插入空值时,需要指定JdbcTypemybatis insert空值报空值异常,但是在pl/sql不会提示错误,主要原因是mybatis无法进行转换 insert into instr ...

最新文章

  1. Linux疑难杂症解决方案100篇(十一)-ubuntu crontab 详细规则及不执行时的解决方法
  2. 关于汽油清洁剂,到底该不该加?
  3. 【bzoj3442】学习小组 费用流
  4. c++异步日志队列_Logback 配置文件这么写,日志 TPS 提高 10 倍
  5. Strust2 本地化/国际化
  6. Windows 8 Directx 开发学习笔记(十四)使用几何着色器实现三角形细分
  7. allure 测试报告本地打开_自动化测试报告太丑?信息实用的Allure Report测试报告拯救你...
  8. CS231n李飞飞计算机视觉 神经网络训练细节part1下
  9. 认清微信支付v2和v3
  10. 记账系统推荐金蝶精斗云_小编总结了金蝶精斗云财务软件的优劣势
  11. 渗透工具TotalPass:TotalPass 是一款默认口令/弱口令扫描工具
  12. 测试简单读取opml
  13. 绘制地形图(测量篇2——实测数据导入CAD)-龙啸
  14. 入侵检测技术框架总论
  15. 计算机税率函数,个税计算器2021 - 个人所得税计算器2021 - 个人所得税的Excel函数计算公式整理...
  16. php to es7,只需五步 集成新版 Elasticsearch7.9 中文搜索 到你的 Laravel7 项目
  17. android圆形取色盘,Android一个HSB的彩色圆盘
  18. HTML基础知识(一) 网页简介
  19. Dubbo 3.0新特性记录
  20. 【网络安全面经】2023届网络安全岗秋招面试题及面试经验分享

热门文章

  1. git回退历史版本无法上传_Git系列教程(二):版本库中添加文件、版本回退
  2. 进入IT行业,要不要参加培训班?
  3. 安装hadoop集群---resourcemanager和NameNode同一台机器上
  4. 学徒学计算机,那个有能力的高人愿意收我做学徒啊,我是学计算机的
  5. dbms_排名前50位的DBMS面试问答
  6. shell中返回值是1为真还是假_shell脚本中判断上一个命令是否执行成功
  7. 笔记本电脑处理器_高通提示低成本5G芯片更强大的笔记本电脑处理器
  8. 电机编码器调零步骤_蒂森电梯编码器整定和主机整定大全
  9. ruby中!!_Ruby反向! 功能
  10. Java StringBuilder codePointBefore()方法与示例