站長資訊網
        最全最豐富的資訊網站

        一起分析MySQL中replace?into與replace區別

        本篇文章給大家帶來了關于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` 這兩個是聯合唯一索引,多關注后續需要用到?。?!

        一起分析MySQL中replace?into與replace區別

        【需求:】

        • 根據表格里面, 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;

        一起分析MySQL中replace?into與replace區別

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

        一起分析MySQL中replace?into與replace區別

        step2: 第二次執行sql情況

        一起分析MySQL中replace?into與replace區別

        一起分析MySQL中replace?into與replace區別

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

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

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

        step3: 第三次執行sql情況

        # 此時執行的是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;

        一起分析MySQL中replace?into與replace區別

        一起分析MySQL中replace?into與replace區別

        • 最終查看到的情況與第二次執行的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;

        一起分析MySQL中replace?into與replace區別

        一起分析MySQL中replace?into與replace區別

        step2:再次執行replace 對應sql:

        一起分析MySQL中replace?into與replace區別

        一起分析MySQL中replace?into與replace區別

        • 第二次執行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;

        一起分析MySQL中replace?into與replace區別

        一起分析MySQL中replace?into與replace區別

        step2:再次執行replace into 對應sql:

        一起分析MySQL中replace?into與replace區別

        一起分析MySQL中replace?into與replace區別

        最終發現,沒有唯一索引的時候,replace into 與replace 居然一摸一樣的效果,都是繼續增加數據。

        通過以上分析,沒看出replace into 與replace 具體有啥區別????有誰知道呢?

        4.replace的用法

        • 單獨replace的作用是替換字段中某數值的顯示效果??梢詳抵抵械牟糠痔鎿Q、也可以全部替換。
        • 如下表格,將user_name的字段,20220302改為"A_20220303"顯示,并且新字段叫做new_name顯示

        一起分析MySQL中replace?into與replace區別

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

        一起分析MySQL中replace?into與replace區別

        推薦學習:mysql視頻教程

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲AV成人精品一区二区三区| 国产精品爱搞视频网站| 四虎精品成人免费永久| 亚洲Av永久无码精品三区在线| 日本精品中文字幕| 国产日韩精品中文字无码 | 久久er99热精品一区二区| 精品国产一区二区22| 久久99精品久久久久久 | 下载天堂国产AV成人无码精品网站| 热re99久久精品国产99热| 91精品国产9l久久久久| 久久久久亚洲精品天堂| 曰韩精品无码一区二区三区 | 国产精品久操视频| 欧美精品亚洲精品日韩专区va| 99久久精品免费看国产一区二区三区| 在线精品自拍无码| 国产亚洲精品无码专区| 欧美精品手机在线播放| 国产亚洲精品xxx| .精品久久久麻豆国产精品| 久久精品国产亚洲AV大全| 中文字幕无码久久精品青草| 亚洲AV永久无码精品一区二区| 久久久久国产成人精品亚洲午夜 | 久久99国产综合精品| 人妻少妇精品视频二区| 欧洲精品色在线观看| 午夜天堂精品久久久久| 亚洲精品国产字幕久久不卡| 亚洲AV日韩精品久久久久| 日韩精品无码熟人妻视频| 亚洲午夜国产精品无码老牛影视| 亚洲国产av无码精品| 亚洲欧美日韩国产精品| 亚洲动漫精品无码av天堂| 久久久久人妻精品一区 | 久久99精品久久久久久齐齐| 久久精品一区二区三区中文字幕| 久久激情亚洲精品无码?V|