<div id="cnblogs_post_body" class="blogpost-body">
<h3 data-source-line="1">replace into的存在的几种情况
<ul data-source-line="3">
当表存在主键并且存在唯一键的时候
mysql> mysql><span style="color: #000000">
mysql><span style="color: #000000"> show create table autoG
<span style="color: #800080">1. row <span style="color: #000000">
Table: auto
Create Table: CREATE TABLE auto (
<span style="color: #0000ff">id <span style="color: #0000ff">int(<span style="color: #800080">10<span style="color: #000000">) unsigned NOT NULL AUTO_INCREMENT,k <span style="color: #0000ff">int(<span style="color: #800080">10<span style="color: #000000">) unsigned NOT NULL,v varchar(<span style="color: #800080">100<span style="color: #000000">) DEFAULT NULL,extra varchar(<span style="color: #800080">200<span style="color: #000000">) DEFAULT NULL,PRIMARY KEY (<span style="color: #0000ff">id<span style="color: #000000"> ),UNIQUE KEY uk_k (k )
) ENGINE=InnoDB AUTO_INCREMENT=<span style="color: #800080">5 DEFAULT CHARSET=<span style="color: #000000">latin1
<span style="color: #800080">1 row <span style="color: #0000ff">in set (<span style="color: #800080">0.00 sec)
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"><img src="https://www.52php.cn/res/2019/01-31/09/51e409b11aa51c150090697429a953ed.gif" alt="复制代码">
mysql> replace into auto(mysql> <span style="color: #0000ff">select *<span style="color: #000000"> from auto;
+----+---+------+---------+
| <span style="color: #0000ff">id | k | v | extra |
+----+---+------+---------+
| <span style="color: #800080">2 | <span style="color: #800080">2 | <span style="color: #800080">2 | extra <span style="color: #800080">2 |
| <span style="color: #800080">3 | <span style="color: #800080">3 | <span style="color: #800080">3 | extra <span style="color: #800080">3 |
| <span style="color: #800080">4 | <span style="color: #800080">5 | NULL | NULL |
+----+---+------+---------+
<span style="color: #800080">3 rows <span style="color: #0000ff">in set (<span style="color: #800080">0.00<span style="color: #000000"> sec)
mysql><span style="color: #000000"> show create table auto G
<span style="color: #800080">1. row <span style="color: #000000">
Table: auto
Create Table: CREATE TABLE auto (
<span style="color: #0000ff">id <span style="color: #0000ff">int(<span style="color: #800080">10<span style="color: #000000">) unsigned NOT NULL AUTO_INCREMENT,UNIQUE KEY uk_k (k )
) ENGINE=InnoDB AUTO_INCREMENT=<span style="color: #800080">5 DEFAULT CHARSET=<span style="color: #000000">latin1
<span style="color: #800080">1 row <span style="color: #0000ff">in set (<span style="color: #800080">0.00 sec)
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"><img src="https://www.52php.cn/res/2019/01-31/09/51e409b11aa51c150090697429a953ed.gif" alt="复制代码">
mysql> mysql><span style="color: #000000"> show create table auto G
<span style="color: #800080">1. row <span style="color: #000000">
Table: auto
Create Table: CREATE TABLE auto (
<span style="color: #0000ff">id <span style="color: #0000ff">int(<span style="color: #800080">10<span style="color: #000000">) unsigned NOT NULL AUTO_INCREMENT,UNIQUE KEY uk_k (k )
) ENGINE=InnoDB AUTO_INCREMENT=<span style="color: #800080">6 DEFAULT CHARSET=<span style="color: #000000">latin1
<span style="color: #800080">1 row <span style="color: #0000ff">in set (<span style="color: #800080">0.00<span style="color: #000000"> sec)
mysql><span style="color: #000000">
mysql><span style="color: #000000">
mysql> replace into auto(<span style="color: #0000ff">id,k,extra)values(<span style="color: #800080">5,<span style="color: #800080">6,<span style="color: #800080">77<span style="color: #000000">);
Query OK,<span style="color: #800080">2 rows affected (<span style="color: #800080">0.01<span style="color: #000000"> sec)
mysql> <span style="color: #0000ff">select *<span style="color: #000000"> from auto;
+----+---+------+---------+
| <span style="color: #0000ff">id | k | v | extra |
+----+---+------+---------+
| <span style="color: #800080">2 | <span style="color: #800080">2 | <span style="color: #800080">2 | extra <span style="color: #800080">2 |
| <span style="color: #800080">3 | <span style="color: #800080">3 | <span style="color: #800080">3 | extra <span style="color: #800080">3 |
| <span style="color: #800080">4 | <span style="color: #800080">5 | NULL | NULL |
| <span style="color: #800080">5 | <span style="color: #800080">6 | NULL | <span style="color: #800080">77 |
+----+---+------+---------+
<span style="color: #800080">4 rows <span style="color: #0000ff">in set (<span style="color: #800080">0.00<span style="color: #000000"> sec)
mysql><span style="color: #000000"> show create table auto G
<span style="color: #800080">1. row <span style="color: #000000">
Table: auto
Create Table: CREATE TABLE auto (
<span style="color: #0000ff">id <span style="color: #0000ff">int(<span style="color: #800080">10<span style="color: #000000">) unsigned NOT NULL AUTO_INCREMENT,UNIQUE KEY uk_k (k )
) ENGINE=InnoDB AUTO_INCREMENT=<span style="color: #800080">6 DEFAULT CHARSET=<span style="color: #000000">latin1
<span style="color: #800080">1 row <span style="color: #0000ff">in set (<span style="color: #800080">0.00 sec)
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"><img src="https://www.52php.cn/res/2019/01-31/09/51e409b11aa51c150090697429a953ed.gif" alt="复制代码">
mysql>mysql> <span style="color: #0000ff">select *<span style="color: #000000"> from auto;
+----+---+------+---------+
| <span style="color: #0000ff">id | k | v | extra |
+----+---+------+---------+
| <span style="color: #800080">2 | <span style="color: #800080">2 | <span style="color: #800080">2 | extra <span style="color: #800080">2 |
| <span style="color: #800080">3 | <span style="color: #800080">3 | <span style="color: #800080">3 | extra <span style="color: #800080">3 |
| <span style="color: #800080">4 | <span style="color: #800080">5 | NULL | NULL |
| <span style="color: #800080">6 | <span style="color: #800080">6 | <span style="color: #800080">66 | NULL |
+----+---+------+---------+
<span style="color: #800080">4 rows <span style="color: #0000ff">in set (<span style="color: #800080">0.00<span style="color: #000000"> sec)
mysql> replace into auto(<span style="color: #0000ff">id,v)values(<span style="color: #800080">6,<span style="color: #800080">2,<span style="color: #800080">88<span style="color: #000000">);
Query OK,<span style="color: #800080">3 rows affected (<span style="color: #800080">0.03 sec)
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"><img src="https://www.52php.cn/res/2019/01-31/09/51e409b11aa51c150090697429a953ed.gif" alt="复制代码">
mysql> replace into auto(mysql> <span style="color: #0000ff">select *<span style="color: #000000"> from auto;
+----+---+------+---------+
| <span style="color: #0000ff">id | k | v | extra |
+----+---+------+---------+
| <span style="color: #800080">3 | <span style="color: #800080">3 | <span style="color: #800080">3 | extra <span style="color: #800080">3 |
| <span style="color: #800080">4 | <span style="color: #800080">5 | NULL | NULL |
| <span style="color: #800080">6 | <span style="color: #800080">2 | <span style="color: #800080">88 | NULL |
+----+---+------+---------+
<span style="color: #800080">3 rows <span style="color: #0000ff">in set (<span style="color: #800080">0.00<span style="color: #000000"> sec)
mysql><span style="color: #000000"> show create table auto G
<span style="color: #800080">1. row <span style="color: #000000">
Table: auto
Create Table: CREATE TABLE auto (
<span style="color: #0000ff">id <span style="color: #0000ff">int(<span style="color: #800080">10<span style="color: #000000">) unsigned NOT NULL AUTO_INCREMENT,UNIQUE KEY uk_k (k )
) ENGINE=InnoDB AUTO_INCREMENT=<span style="color: #800080">7 DEFAULT CHARSET=<span style="color: #000000">latin1
<span style="color: #800080">1 row <span style="color: #0000ff">in set (<span style="color: #800080">0.00 sec)
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"><img src="https://www.52php.cn/res/2019/01-31/09/51e409b11aa51c150090697429a953ed.gif" alt="复制代码">
mysql> mysql><span style="color: #000000"> show create table auto G
<span style="color: #800080">1. row <span style="color: #000000">
Table: auto
Create Table: CREATE TABLE auto (
<span style="color: #0000ff">id <span style="color: #0000ff">int(<span style="color: #800080">10<span style="color: #000000">) unsigned NOT NULL AUTO_INCREMENT,UNIQUE KEY uk_k (k )
) ENGINE=InnoDB AUTO_INCREMENT=<span style="color: #800080">6 DEFAULT CHARSET=<span style="color: #000000">latin1
<span style="color: #800080">1 row <span style="color: #0000ff">in set (<span style="color: #800080">0.00<span style="color: #000000"> sec)
mysql><span style="color: #000000">
mysql> replace into auto(k,<span style="color: #800080">66<span style="color: #000000">);
Query OK,<span style="color: #800080">2 rows affected (<span style="color: #800080">0.04<span style="color: #000000"> sec)
mysql> <span style="color: #0000ff">select *<span style="color: #000000"> from auto;
+----+---+------+---------+
| <span style="color: #0000ff">id | k | v | extra |
+----+---+------+---------+
| <span style="color: #800080">2 | <span style="color: #800080">2 | <span style="color: #800080">2 | extra <span style="color: #800080">2 |
| <span style="color: #800080">3 | <span style="color: #800080">3 | <span style="color: #800080">3 | extra <span style="color: #800080">3 |
| <span style="color: #800080">4 | <span style="color: #800080">5 | NULL | NULL |
| <span style="color: #800080">6 | <span style="color: #800080">6 | <span style="color: #800080">66 | NULL |
+----+---+------+---------+
<span style="color: #800080">4 rows <span style="color: #0000ff">in set (<span style="color: #800080">0.00<span style="color: #000000"> sec)
mysql><span style="color: #000000"> show create table auto G
<span style="color: #800080">1. row <span style="color: #000000">
Table: auto
Create Table: CREATE TABLE auto (
<span style="color: #0000ff">id <span style="color: #0000ff">int(<span style="color: #800080">10<span style="color: #000000">) unsigned NOT NULL AUTO_INCREMENT,UNIQUE KEY uk_k (k )
) ENGINE=InnoDB AUTO_INCREMENT=<span style="color: #800080">7 DEFAULT CHARSET=<span style="color: #000000">latin1
<span style="color: #800080">1 row <span style="color: #0000ff">in set (<span style="color: #800080">0.00 sec)
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码"><img src="https://www.52php.cn/res/2019/01-31/09/51e409b11aa51c150090697429a953ed.gif" alt="复制代码">
当replace into 记录只与主键冲突的时候,auto_increment不会增加,它会对与主键冲突的那一条记录进行更新,没有指定的列将会被更新为默认值
- 当replace into 记录与主键跟唯一索引同时冲突的时候,auto_increment不会增加
- 如果冲突的主键和索引在同一行记录,则replace into只做更新,对于没有指定值的其他列,将会被更新为默认值,
- 如果冲突的主键和索引分别对应2行数据,则MySQL将会删除唯一索引的那一行记录,更新对应主键的那一行记录。
- 当replace into 记录只与唯一索引进行冲突的时候,auto_increment + 1,再对数据进行更新。
最后我们可以对总结分析下,MySQL对replace into的操作是首先是insert操作,如果insert失败,则对insert失败的这条记录进行update,如果update还是失败,则会进行delete操作之后再update。
- 具体流程是这样的:insert记录,发现主键冲突,则update这一行,update的时候发现存在唯一键冲突,则delete对应的唯一键的行后再进行update。如果insert成功,auto_increment自然+1了,然后对这条记录进行update,update的时候发现存在唯一键冲突,则delete对应的唯一键的行后再进行update。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|