首頁 > 軟體

MySQL中Replace語句用法範例詳解

2022-08-08 14:03:42

前言

replace into平時在開發中很少用到,這次是因為在做一個生成分散式ID的開源專案,調研雅虎推出的一個基於資料庫生成唯一id生成方案:flickr 碰到的一個知識盲點,僅以此篇記錄一下。

一、replace into函數

表結構

CREATE TABLE `id_generator` (  
`id` bigint(20) unsigned NOT NULL auto_increment,  
`stub` char(1) NOT NULL default '',  
  PRIMARY KEY  (`id`),  
UNIQUE KEY `stub` (`stub`)  
) ENGINE=MyISAM;

id列是主鍵索引,stub 列是唯一索引 。

replace into向資料庫中插入資料時,如果資料重複,則刪除重複的那行資料,然後在插入一行。

replace具備替換擁有唯一索引或者主鍵索引重複資料的能力,也就是如果使用replace into插入的資料的唯一索引或者主鍵索引與之前的資料有重複的情況,將會刪除原先的資料,然後再進行新增。

那怎麼判斷是否重複的標準就是:唯一索引或者主鍵索引是否一致。語法:replace into table( col1, col2, col3 ) values ( val1, val2, val3 )
語意:向table表中col1, col2, col3列replace資料val1,val2,val3

以id_generator表為例:

REPLACE INTO id_generator(stub) VALUES ('trade')
 
 
執行資訊如下:
No errors; 1 rows affected, taking 20ms

表示只新增了一行。

執行結果:

+----+--------------+
| id | stub         |
+----+--------------+
| 1  | trade        |
+----+--------------+

接續執行如下語句:

REPLACE INTO id_generator(stub) VALUES ('trade')
 
 
執行資訊如下:
No errors; 2 rows affected, taking 23ms

因為刪除了一行,新增了一行。

執行結果:

+----+--------------+
| id | stub         |
+----+--------------+
| 3  | trade        |
+----+--------------+

因為stub列建立列唯一索引,所以replace into當stub有重複的資料行時,會刪除這行資料重新新增,導致id發生變化。

如果replace into唯一索引 id 重複的話,會怎麼樣呢?

REPLACE INTO id_generator(id) VALUES (3)
 
 
執行資訊如下:
No errors; 2 rows affected, taking 28ms

因為刪除了一行,新增了一行。

執行結果:

+----+--------------+
| id | stub         |
+----+--------------+
| 3  |              |
+----+--------------+

這時我們看到stub列的值為空字串,因為id是唯一索引,id=3的記錄已經存在,所以replace into會刪除id=3的記錄,重新新增,導致stub為空。

二、replace into 、insert ignore 和 insert into的區別

replace into 跟 insert into 功能類似。

不同點在於:

insert into 最普遍的插入,如果表中存在主鍵相同的資料,執行會報錯。

insert ignore 如果表中存在主鍵相同的資料不在插入該條資料,反之則插入(存在則忽略,反之插入)。

replace into 首先嚐試插入資料到表中。

  1. 如果發現表中已經有此行資料(根據主鍵或者唯一索引判斷)則先刪除此行資料,然後插入新的資料。
  2. 否則,直接插入新資料。

注意:**插入資料的表必須有主鍵或者是唯一索引!**否則的話,replace into 會直接插入資料,這將導致表中出現重複的資料

三、replace函數

語法:replace(field,search,replace)

說明:field - 資料庫表的列名

search - 需要替換的字串

replace - 替換成的字串

語意:將列名:field 中出現的search字串,全部替換成replace字串。

範例:

update id_generator set stub = replace(stub,'trade','user')
 
select replace(uuid(), '-', '');

附:Mysql中的replace into跟insert into用法類似

  • INSERT :會每次插入一條新的資料。
  • REPLACE:先看錶中是否存在此條資料,如果存在,先刪除該條資料,再插入一條新的資料;如果不存在,則直接插入一條新的資料

重點:

  • 根據表中的主鍵或唯一索引來判斷,如果表中沒有主鍵或唯一索引,那麼REPLACE INTO 就相當於 INSERT

INTO,會直接插入一條資料。

總結

到此這篇關於MySQL中Replace語句用法詳解的文章就介紹到這了,更多相關MySQL Replace用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com