mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

时间:2022-09-21 16:26:14

replace into和insert into on duplicate key update都是为了解决我们平时的一个问题

就是如果数据库中存在了该条记录,就更新记录中的数据,没有,则添加记录。

我们创建一个测试表test

CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(32) DEFAULT '' COMMENT '姓名',
`addr` varchar(256) DEFAULT '' COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

向该表中插入一些数据

INSERT INTO test
VALUES
(NULL, 'a', 'aaa'),
(NULL, 'b', 'bbb'),
(NULL, 'c', 'ccc'),
(NULL, 'd', 'ddd');

影响行数4,结果如下:

mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

我们运行如下语句:

REPLACE INTO test VALUES(NULL, 'e', 'eee');

结果显示,影响行数1条,记录被插入成功了

mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

注意上面的语句,我们并没有填写主键ID。

然后我们再执行下面的语句:

REPLACE INTO test VALUES(1, 'aa', 'aaaa');

结果显示,影响行数2条,ID为1的记录被更新成功了

mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

为什么会出现这种情况,原因就是replace into会首先尝试先往表里面插入记录,因为我们的ID是主键,不可重复,显然这条记录是无法插入成功的,然后replace into会把这条已存在的记录删掉,然后再插入,所以会显示影响行数是2。

我们再运行下面这条语句:

REPLACE INTO test(id,name) VALUES(1, 'aaa');

这里我们只指定id,name字段,我们来看看replace into后addr字段内容是否还存在

mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

显然addr字段内容没有了,跟我们上面的分析是一致的,reaplce into先删除了id为1的记录,然后再插入记录,但我们并没有指定addr的值,所以会如上图所示那样。

但是有些时候我们的需求是,如果记录存在则更新指定字段的数据,原有字段数据仍保留,而不是上面所示的,addr字段数据没有了。

这里就需要用到insert into on duplicate key update

执行如下语句:

INSERT INTO test (id, name)
VALUES(2, 'bb')
ON DUPLICATE KEY
UPDATE
name = VALUES(name);

VALUES(字段名)表示获取当前语句insert的列值,VALUES(name)表示的就是'bb'

结果显示,影响行数2条

mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

如上图所示,addr字段的值被保留了。

insert into on duplicate key update语句的做法是先插入记录,如果不成功,则更新记录,但是为什么影响的行数是2?

我们重新建一张表test2

CREATE TABLE `test2` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`sn` varchar(32) DEFAULT '' COMMENT '唯一键',
`name` varchar(32) DEFAULT '' COMMENT '姓名',
`addr` varchar(256) DEFAULT '' COMMENT '地址',
PRIMARY KEY (`id`),
UNIQUE KEY `sn` (`sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

往里面插入点数据

INSERT INTO test2
VALUES
(NULL, '01', 'a', 'aaa'),
(NULL, '02', 'b', 'bbb'),
(NULL, '03', 'c', 'ccc'),
(NULL, '04', 'd', 'ddd');

我们运行如下语句:

INSERT INTO test2 (sn, name, addr)
VALUES
('02', 'bb', 'bbbb')
ON DUPLICATE KEY
UPDATE
name = VALUES(name),
addr = VALUES(addr);

结果如下:

mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

每运行一次上面的语句,虽然影响行数为0,但表test2的自增字段就加1。

mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点

显然如果insert into on duplicate key update语句仅仅只是在原记录基础上进行更新操作的话,自增字段是不会自动加1的,说明它也进行了记录删除操作。

先插入记录,如果不成功,则删除原记录,但保留了除update语句后字段的值,然后把保留的值与需要更新的值合并,然后插入一条新记录。

总结:

replace into 与 insert into on duplicate key update都是先尝试插入记录,如果不成功,则删除记录,replace into不保留原记录的值,而insert into on duplicate key update保留。然后插入一条新记录。

mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点的更多相关文章

  1. 【转】MySQL的Replace into 与Insert into on duplicate key update真正的不同之处

    原文链接:http://www.jb51.net/article/47090.htm   今天听同事介绍oracle到mysql的数据migration,他用了Insert into ..... on ...

  2. Replace into 与Insert into on duplicate key update的区别

    前提条件:除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用这2条语句没有意义.该语句会与INSERT相同 1. Replace into (1)   添加相同的主键 操作前       ...

  3. MySql中4种批量更新的方法update table2,table1,批量更新用insert into ...on duplicate key update, 慎用replace into.

    mysql 批量更新记录 MySql中4种批量更新的方法最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共 ...

  4. mysql中 REPLACE INTO 和 INSERT INTO 的区别

    mysql中 REPLACE INTO 和 INSERT INTO 的区别 REPLACE INTO 和 INSERT INTO 功能类似,都是像表中插入数据,不同点在于:REPLACE INTO 首 ...

  5. insert into on duplicate key update

    问题 有一个表,建表语句如下: CREATE TABLE `tbl_host` ( `id` bigint(64) NOT NULL AUTO_INCREMENT, `ip` varchar(255) ...

  6. SQL语句实现不存在即插入,存在则increase某字段的功能insert into … on duplicate key update

    前提条件:必须是唯一主键: CREATE UNIQUE INDEX idx_vote_object ON test_customers_vote (`vote_object`, `vote_objec ...

  7. insert into ... on duplicate key update 与 replace 区别

    on duplicate key update:针对主健与唯一健,当插入值中的主健值与表中的主健值,若相同的主健值,就更新on duplicate key update 后面的指定的字段值,若没有相同 ...

  8. (转载)[MySQL技巧]INSERT INTO… ON DUPLICATE KEY UPDATE

    (转载)http://blog.zol.com.cn/2299/article_2298921.html MySQL 自4.1版以后开始支持INSERT … ON DUPLICATE KEY UPDA ...

  9. mysql 插入更新在一条sql ON DUPLICATE KEY UPDATE

    有时候需要进行数据操作的,如果有数据则更新数据, 没有数据则插入. 以往的做法是先查询,再根据查询结果进行判断,执行插入或更新操作 其实 有一种 ON DUPLICATE KEY UPDATE 语法, ...

随机推荐

  1. Cesium原理篇:7最长的一帧之Entity(上)

    之前的最长的一帧系列,我们主要集中在地形和影像服务方面.简单说,之前我们都集中在地球是怎么造出来的,从这一系列开始,我们的目光从GLOBE上解放出来,看看球面上的地物是如何渲染的.本篇也是先开一个头, ...

  2. EUI RadioButton,RadioButtonGroup实现多选项按钮

    一 自动创建的RadioButtonGroup RadioButtonGroup不能在exml里拖动创建,也不能在exml源码里创建.因为wing没提供... 一个exml上摆放的多个RadioBut ...

  3. 浅谈 GPU图形固定渲染管线

    图形渲染管道被认为是实时图形渲染的核心,简称为管道.管道的主要功能是由给定的虚拟摄像机.三维物体.灯源.光照模型.纹理贴图或其他来产生或渲染一个二维图像.由此可见,渲染管线是实时渲染技术的底层工具.图 ...

  4. 【PHP&&mysqli】

    msyqli和mysql只有一个字母的差别,真正的含义是msyql的增强版扩展. MySQL可以处理满足程序员对MySQL数据库操作的各种需要了,为什么还需要mysqli呢?因为mysqli支持面性对 ...

  5. QPS/QPS/PV/UV/服务器数量/并发数/吐吞量/响应时间计算公式

    QPS:每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力.QPS = req/sec = 请求数/秒QPS统计方式 [一般使用 http_load 进行统计]QP ...

  6. 好用的ASP.NET 分页类 简单好用 支持 AJAX 自定义文字

    在做网站没用 JS UI控件时 很实用 用法: var ps=new PageString(); /*可选参数*/ ps.SetIsEnglish = true;// 是否是英文 (默认:false) ...

  7. vc++ 获取当前用户名

    #include<afxwin.h> #include <stdio.h> int main(void) { char userName[MAX_PATH]; unsigned ...

  8. SxsTrace工具用法

    Windows7平台上有一个强大的SxsTrace工具,能够跟踪调试应用程序执行时须要的动态库的版本号和路径. SxsTrace使用的方法: 1.首先必须以Administrator用户身份登录,打开 ...

  9. Android网络开发之Volley--Volley基本用法JsonObjectReques&lpar;二&rpar;

    1.JsonObjectRequest用法 用法和StringRequest基本相同,主要分为3步: (1).实例化一个RequestQueue对象 (2).设置JsonObjectRequest对象 ...

  10. bzoj 3932&colon; &lbrack;CQOI2015&rsqb;任务查询系统

    Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...