首頁  >  文章  >  資料庫  >  一起分析MySQL中replace into與replace差異

一起分析MySQL中replace into與replace差異

WBOY
WBOY轉載
2022-08-22 17:25:332036瀏覽

這篇文章為大家帶來了關於mysql的相關知識,其中主要介紹了MySQL中replace into與replace區別詳解,文中透過範例程式碼介紹的非常詳細,對大家的學習或工作有一定的參考學習價值,希望對大家有幫助。

一起分析MySQL中replace into與replace差異

推薦學習:mysql影片教學

本篇為拋磚引玉篇,之前沒關注過replace into 與replace 的差別。經過多個場景測試,居然沒找到在插入資料的時候兩者有什麼本質的差別?若了解詳情的夥伴們,請告知留言告知一二,不勝感激! ! !

0.故事的背景

【表格結構】

CREATE TABLE `xtp_algo_white_list` (
  `strategy_type` int DEFAULT NULL,
  `user_name` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `status` int DEFAULT NULL,
  `destroy_at` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `xtp_algo_white_list_UN` (`strategy_type`,`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin


# `strategy_type`,`user_name` 这两个是联合唯一索引,多关注后续需要用到!!!

【需求:】

  • 根據表格裡面,209133002266帳戶的數據,重新插入一個使用者20220302001, 使得新產生的資料中strategy_type & status & destroy_at 欄位與209133002266使用者的一致。
  • 使用update 一則更新也行,但是比較慢。
  • 使用replace into 效果會高很多,但深入研究發現也有一些坑的地方

1.replace into 的使用方法

replace into xtp_algo_white_list (`strategy_type`, `user_name`, `status`, `destroy_at`)
select strategy_type ,20220302001, status, destroy_at from xtp_algo_white_list xawl where xawl.user_name = 209133002266;

# replace into 后面跟表格+需要插入的所有字段名(自动递增字段不用写)
# select 后面选择的字段,如果根据查询结果取值,则写字段名;如果是写死的,则直接写具体值即可
# 可以理解为,第一部分是插入表格的结构,第二部分是你查询的数据结果

2.有唯一索引時—replace into & 與replace 效果

step1: 第一次執行sql狀況

replace into xtp_algo_white_list (`strategy_type`, `user_name`, `status`, `destroy_at`)
select strategy_type ,20220302001, status, destroy_at from xtp_algo_white_list xawl where xawl.user_name = 209133002266;

##【執行完之後,查詢結果如下:】

step2: 第二次執行sql狀況

為什麼第二次執行的時候,顯示update 12行的資料且created at 資料更新了,而第一次會顯示update 6行? ? ?

1.因為執行sql的時候,replace into 其實分了兩個步驟執行。第一步是將查詢到資料轉化為新的資料。第二步, 新的資料如果表中已經有相同的內容,則刪除掉。如果沒有相同的內容,則直接插入新的資料。

2.因為如上第一次執行的時候,已經產生一次新資料了,第二次會先刪除,再把最新的資料插入進去,最後才顯示update 12 行

# 此时执行的是replace 

replace xtp_algo_white_list (`strategy_type`, `user_name`, `status`, `destroy_at`)
select strategy_type ,20220302001, status, destroy_at from xtp_algo_white_list xawl where xawl.user_name = 209133002266;

    #最終檢視到的情況與第二次執行的sql一樣。
  • 當新資料已經存在的時候,replace into 與replace是一樣的
  • 後續刪除所有20220302001,執行1次,2次sql,發現replace into 與replace 效果都是一樣的
【總結:】當有唯一索引限制的時候,如果新增的資料會受限於唯一索引,則資料只會插入一次,如果已經存在則會先刪除再插入。此時replace into 與replace 效果相同。

3.沒有唯一索引時—replace into 與 replace

我們將strategy_type & user_name 聯合唯一索引刪除,且刪除20220302001使用者所有資料。最終表格結構如下:

CREATE TABLE `xtp_algo_white_list` (
  `strategy_type` int DEFAULT NULL,
  `user_name` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `status` int DEFAULT NULL,
  `destroy_at` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
  `updated_at` datetime DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

1).replace函數的具體情況

step1:執行如下replace 對應sql:

replace xtp_algo_white_list (`strategy_type`, `user_name`, `status`, `destroy_at`)
select strategy_type ,20220302001, status, destroy_at from xtp_algo_white_list xawl where xawl.user_name = 209133002266;

step2:再次執行replace 對應sql:

    #第二次執行replace 對應sql ,因為沒有唯一索引限制,結果原始資料居然沒變動。又重新產生了新的6條資料。
  • 如果後續也執行如上的sql,則資料也會繼續增加
2).replace into 函數的具體情況

執行之前,先清理資料,將所有20220302001的資料都刪除掉

step1:執行如下replace into 對應sql:

replace into xtp_algo_white_list (`strategy_type`, `user_name`, `status`, `destroy_at`)
select strategy_type ,20220302001, status, destroy_at from xtp_algo_white_list xawl where xawl.user_name = 209133002266;

step2:再次执行replace into 对应sql:

最终发现,没有唯一索引的时候,replace into 与replace 居然一摸一样的效果,都是继续增加数据。

通过以上分析,没看出replace into 与replace 具体有啥区别????有谁知道呢?

4.replace的用法

  • 单独replace的作用是替换字段中某数值的显示效果。可以数值中的部分替换、也可以全部替换。
  • 如下表格,将user_name的字段,20220302改为"A_20220303"显示,并且新字段叫做new_name显示

select *, replace(user_name,20220302,'A_20220303') as "new_name" from xtp_algo_white_list where user_name = 20220302001;

推荐学习:mysql视频教程

以上是一起分析MySQL中replace into與replace差異的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除