MySQL   发布时间:2022-05-15  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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'),'c','ccc'),'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 '唯一键',PRIMARY KEY (`id`),UNIQUE KEY `sn` (`sn`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

往里面插入点数据

INSERT INTO test2
VALUES
	(NULL,'01','02','03','04','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 的使用和不同点全部内容,希望文章能够帮你解决mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:没有