我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL中replace into怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL中replace into怎么用

这篇文章给大家分享的是有关MySQL中replace into怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

在Oracle中有merge into的语法,可以达到一个语句完成同时修改,添加数据的功能,MySQL里面没有merge into的语法,却有replace into。
我们来看看replace into的使用细则。
为了方便演示,我首先创建一个表 users
create table users(
user_id int(11) unsigned not null,
user_name varchar(64) default null,
primary key(user_id)
)engine=innodb default charset=UTF8;
插入2行数据,可能搞Oracle的同学就不适应了,SQL怎么能这么写,不过用起来确实蛮有意思。
> insert into users (user_id,user_name) values(1,'aa'),(2,'bb');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
数据情况如下:    
> select * from users;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | aa        |
|       2 | bb        |
+---------+-----------+
2 rows in set (0.00 sec)
好了,我们来看看replace into的使用,如果向表里插入数据,表里已经存在同样的数据,replace into是会直接更新还是会删除,然后插入。
要搞明白这一点很重要,因为这个直接会影响到数据的准确性。
我们先看看replace into的使用。比如插入下面的一条记录。
> replace into users(user_id, user_name) values(1, 'cc');
Query OK, 2 rows affected (0.00 sec)
完成之后数据的情况如下:
> select * from users;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | cc        |
|       2 | bb        |
+---------+-----------+
2 rows in set (0.00 sec)
看来数据像是被替换了,又好像是删除后,重新覆盖的。怎么验证呢。
我们可以先试试trace的方法。是否能够有所收获。
首先用explain extended的方式,这种方式会得到很多执行计划的细节信息。
MySQL中replace into怎么用
根据输出来看,这种方式得不到预期的数据结果。
我们换一个方式,在5.6以上版本使用optimizer_trace
> set optimizer_trace="enabled=on";
Query OK, 0 rows affected (0.00 sec)

> replace into users(user_id, user_name) values(1, 'dd');
Query OK, 2 rows affected (0.01 sec)
输出结果如下,还是没有得到很详细的信息。
MySQL中replace into怎么用
这个时候不要气馁,要知道办法总比困难多。我们可以换一个新的思路来测试,而且还能顺带验证,何乐而不为。
我们重新创建一个表users2,和users的唯一不同在于user_id使用了auto_increment的方式。
CREATE TABLE `users2` (
user_id int(11) unsigned not null AUTO_INCREMENT,
user_name varchar(64) default null,
primary key(user_id)
)engine=innodb default charset=UTF8;

插入3行数据。
> INSERT INTO users2 (user_id,user_name) VALUES (1, 'aa'), (2, 'bb'), (3, 'cc');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
这个时候查看建表的DDL如下:
> SHOW CREATE TABLE users2\G
*************************** 1. row ***************************
       Table: users2
Create Table: CREATE TABLE `users2` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
数据情况如下:
> SELECT * FROM users2 ;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | aa        |
|       2 | bb        |
|       3 | cc        |
+---------+-----------+
3 rows in set (0.00 sec)
我们先做一个replace into的操作。
> REPLACE INTO users2 (user_id,user_name) VALUES (1, 'dd');
Query OK, 2 rows affected (0.00 sec)

数据情况如下,原来user_id为1的数据做了变更。
> SELECT * FROM users2;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | dd        |
|       2 | bb        |
|       3 | cc        |
+---------+-----------+
3 rows in set (0.01 sec)
再次查看auto_increment的值还是4
> SHOW CREATE TABLE users2\G
*************************** 1. row ***************************
       Table: users2
Create Table: CREATE TABLE `users2` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
这个时候还是很难得出一个结论,切记不要想当然。replace into需要表中存在主键或者唯一性索引,user_id存在主键,我们给user_name创建一个唯一性索引。
> alter table users2 add unique key users2_uq_name(user_name);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
好了,重要的时刻到了,我们看看下面的语句的效果。只在语句中提及user_name,看看user_id是递增还是保留当前的值。
> REPLACE INTO users2 (user_name) VALUES ('dd');
Query OK, 2 rows affected (0.00 sec)
可以看到user_id做了递增,也就意味着这是一个全新的insert插入数据。
> select * from users2;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       2 | bb        |
|       3 | cc        |
|       4 | dd        |
+---------+-----------+
3 rows in set (0.00 sec)
这个时候再次查看建表的DDL如下,auto_increment确实是递增了。
CREATE TABLE `users2` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `users2_uq_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
所以通过上面的测试和推理我们知道,replace into是delete,insert的操作,而非基于当前数据的update。
如此一来我们使用replace into的时候就需要格外注意,可能有些操作非我们所愿,如果插入数据时存在重复的数据,是更新当前记录的情况,该怎么办呢,可以使用replace into的姊妹篇语句,insert into on duplicate key 的方式,后面需要使用update选项。
比如我们还是基于上面的数据,插入user_name为'dd'的数据,如果存在则修改。
> INSERT INTO users2 (user_name) VALUES ('dd') ON DUPLICATE KEY UPDATE user_name=VALUES(user_name);
Query OK, 0 rows affected (0.00 sec)
根据运行结果来看,没有修改数据,比我们期望的还要好一些。
所以任何语句和功能都不是万能的,还得看场景,脱离了使用场景就很难说得清了。
此外,补充replace into的另外一种使用方式,供参考。
> replace into users2(user_id,user_name) select 2,'bbbb'  ;
Query OK, 2 rows affected (0.01 sec)
Records: 1  Duplicates: 1  Warnings: 0

> select *from users2;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       2 | bbbb      |
|       3 | cc        |
|       4 | dd        |
+---------+-----------+
3 rows in set (0.00 sec)
其实再次查看replace into的使用,发现日志中已经赫然提醒,2 rows affected.当然我们有过程有结论,也算是一种不错的尝试了。

感谢各位的阅读!关于“MySQL中replace into怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL中replace into怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MYSQL中Replace Into的用法

新建一个test表,三个字段,id,title,uid,  id是自增的主键,uid是唯一索引;插入两条数据:1 insert into test(title,uid) VALUES (‘123465‘,‘1001‘);2 insert into test
MYSQL中Replace Into的用法
2020-09-22

MySQL的replace into怎么使用

MySQL中的REPLACE INTO语句用于插入或替换一行数据到表中。它的用法如下:REPLACE INTO table_name (column1, column2, ...)VALUES (value1, value2, ...)其中
2023-10-18

MySQL中replace into语句怎么使用

在MySQL中,`REPLACE INTO`语句用于插入新记录或更新已存在的记录。它的语法如下:```sqlREPLACE INTO table_name (column1, column2, ...) VALUES (value1, va
2023-09-14

mysql中replace into与insert into区别

replace into 遇到主键或唯一索引冲突时,会先删除数据,再插入新数据insert into 遇到主键或唯一索引冲突时,会直接报错,不插入数据案例:新建一个test表,三个字段,id,title,uid, id是自增的主键,u
2023-01-18

MySQL中replace into与replace有什么区别

在MySQL中,REPLACE INTO 和 REPLACE 是两种不同形式的替换数据操作。REPLACE INTO 是一种将新数据插入到表中,如果表中已经存在相同的主键或唯一索引,则会先删除旧数据再插入新数据的操作。如果表中不存在相同的
MySQL中replace into与replace有什么区别
2024-04-09

MySQL中replace into与replace区别详解

目录0.故事的背景1.replace into 的使用方法2.有唯一索引时—replace into & 与replace 效果3.没有唯一索引时—replace into 与 replace1).replace函数
2022-08-19

细说mysql replace into用法

replace语句在一般的情况下和insert差不多,但是如果表中存在primary 或者unique索引的时候,如果插入的数据和原来的primary key或者unique相同的时候,会删除原来的数据,然后增加一条新的数据,所以有的时候执
2022-05-11

MySQL中怎么使用replace into语句处理出错

这篇文章给大家分享的是有关MySQL中怎么使用replace into语句处理出错的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。replace into实现原理如果新插入行的主键或唯一键在表中已经存在,则会删除原
2023-06-14

mysql中replace怎么用

小编给大家分享一下mysql中replace怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!replace语句在一般的情况下和insert差不多,但是如果表中
2023-06-14

mysql中的replace怎么使用

在MySQL中,REPLACE语句用于替换表中的数据。它的语法如下:REPLACE INTO table_name (column1, column2, ...)VALUES (value1, value2, ...);这条语句会首先尝
mysql中的replace怎么使用
2024-04-09

MySQL中select insert into怎么使用

在MySQL中,SELECT INTO和INSERT INTO是两个不同的操作。SELECT INTO: 用于将查询结果插入到新的表中。语法如下:SELECT column1, column2INTO new_tableFROM old
MySQL中select insert into怎么使用
2024-04-09

编程热搜

目录