mysql 中 replace into 与 insert into on duplicate key update 的用法和不同点实例分析

 更新时间:2020年02月18日 12:42:01   作者:怀素真  
这篇文章主要介绍了mysql 中 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 的用法和不同点。分享给大家供大家参考,具体如下:

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,结果如下:

我们运行如下语句:

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

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

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

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

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

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

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

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

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

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

显然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条

如上图所示,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);

结果如下:

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

显然如果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相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总

希望本文所述对大家MySQL数据库计有所帮助。

相关文章

  • Linux安装MySQL5.6.24使用文字说明

    Linux安装MySQL5.6.24使用文字说明

    这篇文章主要为大家详细介绍了Linux安装MySQL使用文字说明,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • MySQL存储引擎应用场景MyISAM vs InnoDB优势选择

    MySQL存储引擎应用场景MyISAM vs InnoDB优势选择

    这篇文章主要为大家介绍了MySQL存储引擎应用场景MyISAM vs InnoDB优势选择,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • 用一条mysql语句插入多条数据

    用一条mysql语句插入多条数据

    这篇文章主要介绍了在mysql中使用一条sql语句插入多条数据,效率非常高,但是原理其实很简单,希望对大家有所帮助
    2014-09-09
  • MySQL中join语句怎么优化

    MySQL中join语句怎么优化

    本文主要介绍了MySQL中join语句怎么优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • MySQL replace函数替换字符串语句的用法

    MySQL replace函数替换字符串语句的用法

    MySQL replace函数我们经常用到,下面就为您详细介绍MySQL replace函数的用法,希望对您学习MySQL replace函数方面能有所启迪。
    2010-12-12
  • Python MySQL进行数据库表变更和查询

    Python MySQL进行数据库表变更和查询

    这篇文章主要介绍了Python MySQL进行数据库表变更和查询的相关资料,需要的朋友可以参考下
    2017-05-05
  • Mysql的longblob字段插入数据问题解决

    Mysql的longblob字段插入数据问题解决

    在使用mysql的过程中,有个问题就是mysql的优化,mysql中longblob字段在5.5版本中默认的为1M,需要解决问题的朋友可以参考下
    2014-01-01
  • MySql5.x升级MySql8.x的方法步骤

    MySql5.x升级MySql8.x的方法步骤

    这篇文章主要介绍了MySql5.x升级MySql8.x的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • debian6配置mysql允许远程连接的方法(图)

    debian6配置mysql允许远程连接的方法(图)

    这篇文章主要介绍了debian6配置mysql允许远程连接的方法,大家可以参考,最后可看图
    2013-11-11
  • mysql命令行下用户管理方法分享

    mysql命令行下用户管理方法分享

    如果有mysql管理工具phpmyadmin的话,我们可以通过图形画界面来对用户进行管理,但是如果没有phpmyadmin这样的管理工具怎么办呢
    2012-07-07

最新评论