MySQL中replaceinto怎么用

這篇文章給大家分享的是有關(guān)MySQL中replace into怎么用的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),富縣企業(yè)網(wǎng)站建設(shè),富縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,富縣網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,富縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

在Oracle中有merge into的語法,可以達(dá)到一個(gè)語句完成同時(shí)修改,添加數(shù)據(jù)的功能,MySQL里面沒有merge into的語法,卻有replace into。
我們來看看replace into的使用細(xì)則。
為了方便演示,我首先創(chuàng)建一個(gè)表 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行數(shù)據(jù),可能搞Oracle的同學(xué)就不適應(yīng)了,SQL怎么能這么寫,不過用起來確實(shí)蠻有意思。
> 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
數(shù)據(jù)情況如下:    
> select * from users;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | aa        |
|       2 | bb        |
+---------+-----------+
2 rows in set (0.00 sec)
好了,我們來看看replace into的使用,如果向表里插入數(shù)據(jù),表里已經(jīng)存在同樣的數(shù)據(jù),replace into是會(huì)直接更新還是會(huì)刪除,然后插入。
要搞明白這一點(diǎn)很重要,因?yàn)檫@個(gè)直接會(huì)影響到數(shù)據(jù)的準(zhǔn)確性。
我們先看看replace into的使用。比如插入下面的一條記錄。
> replace into users(user_id, user_name) values(1, 'cc');
Query OK, 2 rows affected (0.00 sec)
完成之后數(shù)據(jù)的情況如下:
> select * from users;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | cc        |
|       2 | bb        |
+---------+-----------+
2 rows in set (0.00 sec)
看來數(shù)據(jù)像是被替換了,又好像是刪除后,重新覆蓋的。怎么驗(yàn)證呢。
我們可以先試試trace的方法。是否能夠有所收獲。
首先用explain extended的方式,這種方式會(huì)得到很多執(zhí)行計(jì)劃的細(xì)節(jié)信息。
MySQL中replace into怎么用
根據(jù)輸出來看,這種方式得不到預(yù)期的數(shù)據(jù)結(jié)果。
我們換一個(gè)方式,在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)
輸出結(jié)果如下,還是沒有得到很詳細(xì)的信息。
MySQL中replace into怎么用
這個(gè)時(shí)候不要?dú)怵H,要知道辦法總比困難多。我們可以換一個(gè)新的思路來測試,而且還能順帶驗(yàn)證,何樂而不為。
我們重新創(chuàng)建一個(gè)表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行數(shù)據(jù)。
> 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
這個(gè)時(shí)候查看建表的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=4DEFAULT CHARSET=utf8
1 row in set (0.01 sec)
數(shù)據(jù)情況如下:
> SELECT * FROM users2 ;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       1 | aa        |
|       2 | bb        |
|       3 | cc        |
+---------+-----------+
3 rows in set (0.00 sec)
我們先做一個(gè)replace into的操作。
> REPLACE INTO users2 (user_id,user_name) VALUES (1, 'dd');
Query OK, 2 rows affected (0.00 sec)

數(shù)據(jù)情況如下,原來user_id為1的數(shù)據(jù)做了變更。
> 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)
這個(gè)時(shí)候還是很難得出一個(gè)結(jié)論,切記不要想當(dāng)然。replace into需要表中存在主鍵或者唯一性索引,user_id存在主鍵,我們給user_name創(chuàng)建一個(gè)唯一性索引。
> 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
好了,重要的時(shí)刻到了,我們看看下面的語句的效果。只在語句中提及user_name,看看user_id是遞增還是保留當(dāng)前的值。
> REPLACE INTO users2 (user_name) VALUES ('dd');
Query OK, 2 rows affected (0.00 sec)
可以看到user_id做了遞增,也就意味著這是一個(gè)全新的insert插入數(shù)據(jù)。
> select * from users2;
+---------+-----------+
| user_id | user_name |
+---------+-----------+
|       2 | bb        |
|       3 | cc        |
|       4 | dd        |
+---------+-----------+
3 rows in set (0.00 sec)
這個(gè)時(shí)候再次查看建表的DDL如下,auto_increment確實(shí)是遞增了。
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=5DEFAULT CHARSET=utf8
所以通過上面的測試和推理我們知道,replace into是delete,insert的操作,而非基于當(dāng)前數(shù)據(jù)的update。
如此一來我們使用replace into的時(shí)候就需要格外注意,可能有些操作非我們所愿,如果插入數(shù)據(jù)時(shí)存在重復(fù)的數(shù)據(jù),是更新當(dāng)前記錄的情況,該怎么辦呢,可以使用replace into的姊妹篇語句,insert into on duplicate key 的方式,后面需要使用update選項(xiàng)。
比如我們還是基于上面的數(shù)據(jù),插入user_name為'dd'的數(shù)據(jù),如果存在則修改。
> INSERT INTO users2 (user_name) VALUES ('dd') ON DUPLICATE KEY UPDATE user_name=VALUES(user_name);
Query OK, 0 rows affected (0.00 sec)
根據(jù)運(yùn)行結(jié)果來看,沒有修改數(shù)據(jù),比我們期望的還要好一些。
所以任何語句和功能都不是萬能的,還得看場景,脫離了使用場景就很難說得清了。
此外,補(bǔ)充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)
其實(shí)再次查看replace into的使用,發(fā)現(xiàn)日志中已經(jīng)赫然提醒,2 rows affected.當(dāng)然我們有過程有結(jié)論,也算是一種不錯(cuò)的嘗試了。

感謝各位的閱讀!關(guān)于“MySQL中replace into怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

新聞名稱:MySQL中replaceinto怎么用
標(biāo)題鏈接:http://bm7419.com/article32/psdisc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站維護(hù)、做網(wǎng)站、App設(shè)計(jì)、服務(wù)器托管、全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司