4种插入数据的方式

第一种:insert into

insert into是最常用的插入数据的方式,可以单条插入,也可以多条,还可以指定从其他表中select然后插入。 详细可以参考:insert语法参考。

第二种:insert ignore into

加上ignore,当表中有相同键的时候,忽略插入。因此从效果上来说,就是以旧数据为准。它和下面将要介绍的第三种插入方式正好相反。

第三种:replace into

使用replace,如果表中有冲突的键,那么先删除这样的行,然后插入。从效果上来说,就是以新数据为准。 前面的两种方式,要么全旧,要么全新,那么有没有折中的方式呢?这就是第四种:有选择的替换。

第四种:insert into on duplicate key update

当发现冲突键的时候,有选择的更新某些列的值。这里有个特别的values函数,当遇到数据冲突时,可以引用values中的值来更新相关的数据:
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

举个例子,字段a被定义为UNIQUE,并且原数据库表table中已存在记录(2,2,9)和(3,2,1),如果插入记录的a值与原有记录重复,则更新原有记录,否则插入新行:

复制代码代码如下:
INSERT INTO TABLE (a,b,c) VALUES 
(1,2,3), 
(2,5,7), 
(3,3,6), 
(4,8,2) 
ON DUPLICATE KEY UPDATE b=VALUES(b); 

以上SQL语句的执行,发现(2,5,7)中的a与原有记录(2,2,9)发生唯一值冲突,则执行ON DUPLICATE KEY UPDATE,将原有记录(2,2,9)更新成(2,5,9),将(3,2,1)更新成(3,3,1),插入新记录(1,2,3)和(4,8,2)

注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并不是SQL标准语法!

使用场景

有了上面的介绍,使用场景已很明了。特别说明几点:

    1. 如果表没有主键,或主键是没有意义的伪列,而且没有其他唯一约束,那么请不要使用replace into,因为这种情况下使用insert into同样可以做到,你画蛇添足的效果可能就是像上面一样,触发bug。

    2. 如果表上有自增的主键,还有其他唯一键,那么使用replace into要小心了:其他唯一键一旦冲突,旧数据会被删除,然后插入新的数据行,结果就是自增主键的值越来越大,尽管表的数据量不大。长此以往,即使表的数据只有区区几千行,但是自增列的值可能非常大,最后越界。这种情况下可以采用insert into on duplicate key update的方式。当然也可以去掉自增的列,但是innodb的聚簇索引结构情况下,修改主键是”比较愚蠢的做法”。

    3. 关于返回值的判断:一条replace into语句可能会影响多行。如果一个表有多个唯一键,如果发生键冲突,必须先删除一行,再试图插入数据的时候,可能与第二个唯一键又冲突,又需要删除…,因此有可能删除了多行数据最后才成功插入一条数据。因此,被删除的行数是受影响的行数减1。

MYSQL 4种插入数据的方式比较的更多相关文章

  1. Request三种获取数据的方式

    今天在做ajax请求后台代码时,发现ajax的方法都对,但就是请求不了后台代码,后来在同事帮助下才发现前台定义了两个相同参数导致请求出错. 下面记录一下request三种获取数据的方式: 1. Req ...

  2. mysql数据库中插入数据INSERT INTO SET的优势

    往mysql数据库中插入数据.以前常用 INSERT INTO 表名 (列名1,列名2…) VALUES(列值1,列值2); 如果在PHP程序中,就会写成如下示例(往商品库里增加商品) $sql = ...

  3. MYSQL查询和插入数据的流程是怎样的

    一个查询语句经过哪些步骤 这次我们从MySQL的整体架构来讲SQL的执行过程,如下图: 在整体分为两部分Server和引擎层,这里引擎层我使用InnoDB去代替,引擎层的设计是插件形式的,可以任意替代 ...

  4. MySQL如何快速插入数据

    前言: 日常学习和工作中,经常会遇到导数据的需求.比如数据迁移.数据恢复.新建从库等,这些操作可能都会涉及大量数据的导入.有时候导入进度慢,电脑风扇狂转真的很让人崩溃,其实有些小技巧是可以让导入更快速 ...

  5. 一起学Hive——详解四种导入数据的方式

    在使用Hive的过程中,导入数据是必不可少的步骤,不同的数据导入方式效率也不一样,本文总结Hive四种不同的数据导入方式: 从本地文件系统导入数据 从HDFS中导入数据 从其他的Hive表中导入数据 ...

  6. mysql使用存储过程插入数据后,参数为中文的为?或乱码

    最近了解了一下mysql存储过程,之前版本的mysql不支持存储过程,5.0版本后就可以支持存储过程的使用:恰好笔者下载使用版本为5.6.20: 做了一个给表插入数据的简单存储过程,发现打开表后汉字全 ...

  7. 向mysql中批量插入数据的性能分析

    MYSQL批量插入数据库实现语句性能分析 假定我们的表结构如下 代码如下   CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 5 ...

  8. mysql:insert插入数据过慢如何解决,设置innodb_flush_log_at_trx_commit为0就能解决

    问题: 最近在做性能测试,造数据,发现insert好慢,只有几十条每秒,很奇怪,最后再网上找到了原因. 网文如下: MY SQL insert 速度过慢 最近在用MySQL做存储,测试中发现插入数据太 ...

  9. 8种json数据查询方式

    你有没有对“在复杂的JSON数据结构中查找匹配内容”而烦恼.这里有8种不同的方式可以做到: JsonSQL JsonSQL实现了使用SQL select语句在json数据结构中查询的功能. 例子: ? ...

随机推荐

  1. 一款Regular expression在线检测工具

    记录下我自己使用的一款正则表达式使用工具 https://regex101.com/ 输入正则表达式后,可以在下面的“TEST STRING”中来测试对应的字符串是否满足该正则表达式 个人觉得非常好用

  2. matlab 矩阵运算技巧

    1.a=a(:) 作用:将矩阵转化成列向量 a=[a11 a12 a13                      a=[a11 a21 a12 a22 a13 a23]^T a21 a22 a23] ...

  3. ProtoBuf练习

    环境设置 项目地址 https://github.com/silvermagic/ProtoBufDev.git 操作系统 64位 Fedora 24 安装protobuf $ git clone h ...

  4. Scrapy框架初探

    Scrapy 貌似是 Python 最出名的爬虫框架 0. 文档 中文文档:https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.ht ...

  5. 51nod1521(set.upper_bound())

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1521 题意:中文题诶- 思路: 我们先看一下set容器的三个 ...

  6. 【转载】Hyperledger学习小结

    Hyperledger学习小结 自学Hyperledger Composer也有段时间了,是时候对所学的知识总结一下了.因为没有实际项目参与的话,差不多也就到此为止了.后续可能会去了解一下以太坊的技术 ...

  7. shell脚本——循环和函数

    1.打印一个等腰三角形 ` ;do -$i]` ;do echo -n ' ' done -]` ;do echo -n '*' done echo done 2.打印99乘法表 #!/bin/bas ...

  8. Struts2练习

    首先从下载的Struts2中apps文件夹下选中需要联系的示例,拷贝jar包到eclipse项目WEB-INF/lib目录下,然后构建路径

  9. 小程序组件的继承 - behavior

    1.目录结构 demo-one 和 demo-two 一起公用一些属性 和 方法 存在demo-beh.js中 需要像模块一样导出 2.调用的方法: // components/demo-class/ ...

  10. JMETER从JSON响应中提取数据

    如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量. 好消息!您正在掌握掌握JMeter Json Extractor的权威指南.作为Rest API测试指南的补充,您将学习掌握J ...