亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL replace into 語句淺析(一)

2024-07-24 13:07:24
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了MySQL replace into 語句淺析(一),本文講解了replace into的原理、使用方法及使用的場景和使用示例,需要的朋友可以參考下
 

一 介紹

  在筆者支持業務過程中,經常遇到開發咨詢replace into 的使用場景以及注意事項,這里做個總結。從功能原理,性能和注意事項上做個說明。

二 原理

2.1 當表中存在主鍵但是不存在唯一建的時候。
表結構

復制代碼代碼如下:

CREATE TABLE `yy` (
  `id` bigint(20) NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
root@test 02:43:58>insert into yy values(1,'abc');
Query OK, 1 row affected (0.00 sec)
root@test 02:44:25>replace into yy values(2,'bbb');
Query OK, 1 row affected (0.00 sec)
root@test 02:55:42>select * from yy;
+----+------+
| id | name |
+----+------+
| 1 | abc |
| 2 | bbb |
+----+------+
2 rows in set (0.00 sec)
root@test 02:55:56>replace into yy values(1,'ccc');
Query OK, 2 rows affected (0.00 sec)

如果本來已經存在的主鍵值,那么MySQL做update操作。
復制代碼代碼如下:

### UPDATE test.yy
### WHERE
### @1=1 /* LONGINT meta=0 nullable=0 is_null=0 */
### @2='abc' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
### SET
### @1=1 /* LONGINT meta=0 nullable=0 is_null=0 */
### @2='ccc' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

如果本來相應的主鍵值沒有,那么做insert 操作  replace into yy values(2,'bbb');
復制代碼代碼如下:

### INSERT INTO test.yy
### SET
### @1=2 /* LONGINT meta=0 nullable=0 is_null=0 */
### @2='bbb' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */
# at 623
#140314 2:55:42 server id 136403306 end_log_pos 650 Xid = 6090885569

 

2.2 當表中主鍵和唯一鍵同時存在時

復制代碼代碼如下:

CREATE TABLE `yy` (
  `id` int(11) NOT NULL DEFAULT /'0/',
  `b` int(11) DEFAULT NULL,
  `c` int(11) DEFAULT NULL 
  PRIMARY KEY (`a`), 
  UNIQUE KEY `uk_bc` (`b`,`c`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8

情形1 主鍵沖突
復制代碼代碼如下:

root@test 04:37:18>replace into yy values(1,2,3);
Query OK, 1 row affected (0.00 sec)
root@test 04:37:37>replace into yy values(2,2,4);
Query OK, 1 row affected (0.00 sec)
root@test 04:38:05>select * from yy;
+----+------+------+
| id | b | c |
+----+------+------+
| 1 | 2 | 3 |
| 2 | 2 | 4 |
+----+------+------+
2 rows in set (0.00 sec)
root@test 04:38:50>replace into yy values(1,2,5);
Query OK, 2 rows affected (0.00 sec)
root@test 04:38:58>select * from yy;
+----+------+------+
| id | b | c |
+----+------+------+
| 2 | 2 | 4 |
| 1 | 2 | 5 |
+----+------+------+
2 rows in set (0.00 sec)

主鍵沖突時,數據庫對表做先刪除然后插入的操作,也即先刪除id=1的記錄,然后插入新的id=1 的記錄(1,2,5).
復制代碼代碼如下:

BINLOG '
Io5hVROWYHC+KwAAAEICAAAAAMoMAAAAAAEABHRlc3QAAnl5AAMDAwMABg==
Io5hVRmWYHC+KgAAAGwCAAAAAMoMAAAAAAAAA//4AQAAAAIAAAADAAAA
### DELETE FROM test.yy
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2=2 /* INT meta=0 nullable=1 is_null=0 */
### @3=3 /* INT meta=0 nullable=1 is_null=0 */
Io5hVReWYHC+KgAAAJYCAAAAAMoMAAAAAAEAA//4AQAAAAIAAAAFAAAA
'/*!*/;
### INSERT INTO test.yy
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2=2 /* INT meta=0 nullable=1 is_null=0 */
### @3=5 /* INT meta=0 nullable=1 is_null=0 */
# at 662
#150524 16:38:58 server id 3195035798 end_log_pos 689 Xid = 22962508
COMMIT/*!*/

情形2 唯一建沖突
復制代碼代碼如下:

root@test 04:48:30>select * from yy;
+----+------+------+
| id | b | c |
+----+------+------+
| 1 | 2 | 4 |
| 2 | 2 | 5 |
| 3 | 3 | 5 |
| 4 | 3 | 6 |
+----+------+------+
4 rows in set (0.00 sec)
root@test 04:53:21>replace into yy values(5,3,6);
Query OK, 2 rows affected (0.00 sec)
root@test 04:53:40>select * from yy;
+----+------+------+
| id | b | c |
+----+------+------+
| 1 | 2 | 4 |
| 2 | 2 | 5 |
| 3 | 3 | 5 |
| 5 | 3 | 6 |
+----+------+------+
4 rows in set (0.00 sec)

主鍵不沖突,唯一鍵沖突時,數據庫對表 唯一鍵為(3,6)的行做update操作,將主鍵修改為要插入的值,id=4 改為id=5。
復制代碼代碼如下:

BINLOG /'
lJFhVROWYHC+KwAAANoAAAAAAMoMAAAAAAEABHRlc3QAAnl5AAMDAwMABg==
lJFhVRiWYHC+OAAAABIBAAAAAMoMAAAAAAEAA///+AQAAAADAAAABgAAAPgFAAAAAwAAAAYAAAA=
/'/*!*/;
### UPDATE test.yy
### WHERE
### @1=4 /* INT meta=0 nullable=0 is_null=0 */
### @2=3 /* INT meta=0 nullable=1 is_null=0 */
### @3=6 /* INT meta=0 nullable=1 is_null=0 */
### SET
### @1=5 /* INT meta=0 nullable=0 is_null=0 */
### @2=3 /* INT meta=0 nullable=1 is_null=0 */
### @3=6 /* INT meta=0 nullable=1 is_null=0 */
# at 274
#150524 16:53:40 server id 3195035798 end_log_pos 301 Xid = 22962872
COMMIT/*!*/

情形3 主鍵和唯一鍵同時沖突,如果需要插入的值的主鍵 和唯一和表中已經存在的存在沖突。
復制代碼代碼如下:

root@test 04:53:52>replace into yy values(1,3,6);
Query OK, 3 rows affected (0.00 sec) ---注意此處影響的行數是3 
root@test 04:55:35>select * from yy;
+----+------+------+
| id | b | c |
+----+------+------+
| 2 | 2 | 5 |
| 3 | 3 | 5 |
| 1 | 3 | 6 |
+----+------+------+
3 rows in set (0.00 sec)

 要插入的值(1,3,6) 主鍵于 表里面的id=1的值沖突,唯一鍵(3,6)和表中id=5的記錄沖突,MySQL 處理的時候 ,先刪除id=1的行,然后更新了id=5的行。
 
復制代碼代碼如下:

BINLOG /'
B5JhVROWYHC+KwAAAJwBAAAAAMoMAAAAAAEABHRlc3QAAnl5AAMDAwMABg==
B5JhVRmWYHC+KgAAAMYBAAAAAMoMAAAAAAAAA//4AQAAAAIAAAAEAAAA
### DELETE FROM test.yy
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2=2 /* INT meta=0 nullable=1 is_null=0 */
### @3=4 /* INT meta=0 nullable=1 is_null=0 */
B5JhVRiWYHC+OAAAAP4BAAAAAMoMAAAAAAEAA///+AUAAAADAAAABgAAAPgBAAAAAwAAAAYAAAA=
/'/*!*/;
### UPDATE test.yy
### WHERE
### @1=5 /* INT meta=0 nullable=0 is_null=0 */
### @2=3 /* INT meta=0 nullable=1 is_null=0 */
### @3=6 /* INT meta=0 nullable=1 is_null=0 */
### SET
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2=3 /* INT meta=0 nullable=1 is_null=0 */
### @3=6 /* INT meta=0 nullable=1 is_null=0 */
# at 510
#150524 16:55:35 server id 3195035798 end_log_pos 537 Xid = 22962904
COMMIT/*!*/

 

三 結論

   對表進行replace into操作的時候,
   當不存在沖突時,replace into 相當于insert操作。 
   當存在pk沖突的時候是先delete再insert,如果主鍵是自增的,則自增主鍵會做 +1 操作?!?.5,5.6版本均做過測試】
   當存在uk沖突的時候是直接update。,如果主鍵是自增的,則自增主鍵會做 +1 操作。   【5.5,5.6版本均做過測試】

MySQL replace into 語句淺析(一)

   了解上述原理和結論之后,以后再遇到replace into 的時候,相信各位讀者可以知道如何選擇,由于篇幅限制,后續文章會基于replace into原理,講述生產過程中的注意事項。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色yeye香蕉凹凸一区二区av| 亚洲香蕉伊综合在人在线视看| 国内精品视频久久| 中文日韩电影网站| 欧美另类99xxxxx| 亚洲国产日韩欧美在线动漫| 国产精品扒开腿做| 成人精品一区二区三区| 欧美日韩亚洲国产一区| 欧美日韩在线另类| 另类天堂视频在线观看| 亚洲欧美激情在线视频| 高清欧美性猛交| 国产成人精品在线视频| 亚洲精品av在线| 77777少妇光屁股久久一区| 福利微拍一区二区| 国产精品专区一| 国产成人小视频在线观看| 亚洲最大的免费| 亚洲女在线观看| 国产欧美日韩亚洲精品| 7m精品福利视频导航| 精品国产福利在线| 亚洲国产精品电影| 中文字幕欧美日韩va免费视频| 亚洲精品www久久久久久广东| 国产91九色视频| 欧美—级a级欧美特级ar全黄| 国产欧美日韩中文字幕| 欧美日韩中文字幕在线| 日韩精品在线播放| 国产成人精品最新| 黄色一区二区三区| 国产精品精品视频一区二区三区| 国产亚洲成精品久久| 中文字幕日韩综合av| 久久久精品视频在线观看| 国产日本欧美一区二区三区在线| 91在线视频成人| 久久色精品视频| 欧美猛男性生活免费| 亚洲自拍偷拍区| 97精品国产97久久久久久| 日韩成人中文字幕| 久久久国产精品免费| 国产精品人成电影| 国产精品人成电影| 日韩欧美精品在线观看| 亚洲天堂av高清| 亚洲国产97在线精品一区| 91嫩草在线视频| 九九精品视频在线观看| 午夜精品蜜臀一区二区三区免费| 成人xxxxx| 国产在线精品一区免费香蕉| 久久精品国产久精国产一老狼| 久久综合久久美利坚合众国| 色噜噜国产精品视频一区二区| 国产精品日韩在线| 欧美极度另类性三渗透| 最好看的2019的中文字幕视频| 中文字幕精品久久久久| 狠狠色噜噜狠狠狠狠97| 在线观看国产精品淫| 欧美日韩国产成人| 国内精品美女av在线播放| 色悠悠久久88| 久久久久国产精品免费网站| 国产免费一区二区三区香蕉精| 96pao国产成视频永久免费| 国产成人亚洲综合91精品| 国产情人节一区| 亚洲精品电影网站| 日本欧美精品在线| 久久夜色精品国产亚洲aⅴ| 亚洲性线免费观看视频成熟| 57pao成人国产永久免费| 日韩在线免费观看视频| 国产精品一区久久久| 国产精品高清网站| 成人午夜高潮视频| 欧美性猛交xxxx乱大交极品| 黑人巨大精品欧美一区二区免费| 欧美激情一级二级| 成人久久久久久久| 国产精品劲爆视频| 伦伦影院午夜日韩欧美限制| 日本国产高清不卡| 久久在线精品视频| 欧美日韩免费观看中文| 欧美激情在线视频二区| 日韩在线不卡视频| 国产成人+综合亚洲+天堂| 亚洲国产精品视频在线观看| 欧美性视频精品| 在线看国产精品| 国产精品偷伦一区二区| 久久综合久久88| 欧美色图在线视频| 97超级碰碰人国产在线观看| 久久久噜久噜久久综合| 欧美中文在线观看| 国模叶桐国产精品一区| 91高清视频在线免费观看| 亚洲国产欧美一区二区丝袜黑人| 国产99在线|中文| 26uuu另类亚洲欧美日本老年| 国产精品久久久久久亚洲调教| 国产视频亚洲精品| 久久天天躁日日躁| 国产精品永久在线| 国产精品日韩av| 精品无人区乱码1区2区3区在线| 亚洲成人网av| 欧美日韩一二三四五区| 91国产精品91| 26uuu久久噜噜噜噜| 在线观看精品国产视频| 91精品国产一区| 亚洲精品国产精品自产a区红杏吧| 成人免费观看49www在线观看| 日韩美女av在线免费观看| 色老头一区二区三区在线观看| 亚洲在线免费视频| 国产日韩在线播放| 欧美日韩中文在线| 国内精品久久久久久久久| 亚洲第一区第二区| 国产91在线播放| 夜夜嗨av一区二区三区四区| 日韩av黄色在线观看| 欧美视频专区一二在线观看| 美女福利视频一区| 欧美黄色小视频| 久久噜噜噜精品国产亚洲综合| 成人福利在线视频| 亚洲美女自拍视频| 日韩在线播放一区| 欧美福利小视频| 欧美成人黑人xx视频免费观看| 在线播放日韩专区| 91成人在线视频| 神马国产精品影院av| 中文国产成人精品久久一| 日韩av影院在线观看| 亚洲精品国产精品久久清纯直播| 欧美丰满少妇xxxxx| 国产热re99久久6国产精品| 国产区亚洲区欧美区| 欧美自拍视频在线| 中文字幕亚洲一区二区三区五十路| 九九热在线精品视频| 国产精品久久电影观看| 欧美美女操人视频| 日韩欧美国产中文字幕| 国产精品三级美女白浆呻吟| 欧美日韩中文字幕| 亚洲视频视频在线| 国产精品久久婷婷六月丁香| 欧美理论在线观看| 亚洲天堂视频在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲国产97在线精品一区|