MySQL之存在則更新,否則就插入數(shù)據(jù)
背景
用戶獲得免費電影觀看權(quán),如果同個電影獲得再次獲得觀看權(quán),則在領(lǐng)取記錄中更新獲取時間,如果首次獲取的免費電影觀看權(quán),則新增一條獲獎記錄。
思考
其實是數(shù)據(jù)庫的“存在則更新數(shù)據(jù),不存在就插入數(shù)據(jù)”問題,MySQL有相應(yīng)的語法可以解決,需要搭配索引。
數(shù)據(jù)表結(jié)構(gòu)
CREATE TABLE `prize_order` ( `id` int NOT NULL AUTO_INCREMENT, `mobile` char(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '手機號碼', `order_status` int DEFAULT '0' COMMENT '受理狀態(tài),1-成功,0-失敗', `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間', `prize_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '獎品電影編號', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `index_uni` (`mobile`,`prize_id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='訂單日志表';
索引
數(shù)據(jù)
第一種insert語法(推薦?。。。?/h3>
語法(此時不知道表中已有prize_id='1'的數(shù)據(jù))
insert into prize_order (mobile,create_time,prize_id) values('15122223333','2022-10-02 00:00:00','1') on DUPLICATE key update create_time =now()
不知道表中數(shù)據(jù)的情況下,已有數(shù)據(jù)會更新,mobile='15122223333' and prize_id='1'數(shù)據(jù)會修改create_time字段=now()
執(zhí)行情況
語法(此時不知道表中無prize_id='60'的數(shù)據(jù))
insert into prize_order (mobile,create_time,prize_id) values('15122223333',now(),'60') on DUPLICATE key update create_time = now()
不知道表中數(shù)據(jù)的情況下, 當數(shù)據(jù)不存在時,則會新增一條mobile='15122223333' ,prize_id='1',create_time字段=now() 的數(shù)據(jù)
執(zhí)行情況
第二種replace語法(個別場景下使用)
語法(此時不知道表中已有prize_id='1'的數(shù)據(jù))
replace into prize_order(mobile,order_status,create_time,prize_id)VALUES('15122223333','1',now(),'1')
執(zhí)行情況
???????
語法(此時不知道表中無prize_id='20'的數(shù)據(jù))
replace into prize_order(mobile,order_status,create_time,prize_id)VALUES('15122223333','1',now(),'20')
執(zhí)行結(jié)果
缺點
相信replace語法對很多“存在則更新,否則插入數(shù)據(jù)”的需求都滿足。
我們也看到了,它會刪除原數(shù)據(jù),再進行插入數(shù)據(jù),此時你有些字段不想更新,則被它抹除了,所以,用這個語法記得把所有需要的字段都正確賦值,不然會出現(xiàn)丟失數(shù)據(jù)的后果。
總結(jié)
根據(jù)以上對比,insert語法更優(yōu),推薦使用,因為不影響原有id,也只會更新所需字段,其余不處理的字段保持原有值;而replace語法則會改變id和改變除所需字段以外的值,有丟失數(shù)據(jù)的風險,建議熟悉該語法并對應(yīng)業(yè)務(wù)場景才使用。
好了,以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL 數(shù)據(jù)庫設(shè)計復習筆記及項目實戰(zhàn)
參考的數(shù)據(jù)庫文檔主要有:目前國內(nèi)的常見的PHP系統(tǒng)的數(shù)據(jù)庫2010-03-03delete、truncate、drop的區(qū)別以及該如何選擇
這篇文章主要給大家介紹了關(guān)于delete、truncate、drop的區(qū)別以及該如何選擇的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11解決xmapp啟動mysql出現(xiàn)Error: MySQL shutdown unexpec
這篇文章主要介紹了解決xmapp啟動mysql出現(xiàn)Error: MySQL shutdown unexpectedly.問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06mysql signed unsigned和zerofill使用與區(qū)別
mysql中有符號signed,無符號unsigned與零填充zerofill,本文主要介紹了mysql signed unsigned和zerofill使用與區(qū)別,具有一定的參考價值,感興趣的可以了解一下2024-07-07MySQL遇到“?Access?denied?for?user?”問題的解決辦法
這篇文章主要介紹了MySQL遇到“?Access?denied?for?user?”問題的解決辦法,文中通過代碼示例講解的非常詳細,對大家的解決問題有一定的幫助,需要的朋友可以參考下2024-12-12使用Canal監(jiān)聽MySQL Binlog日志的實現(xiàn)方案
本文檔探討了在分布式系統(tǒng)中處理超時未支付訂單的挑戰(zhàn)與解決方案,文檔還詳細介紹了MySQL Binlog的配置、Canal中間件的部署與配置,以及消息監(jiān)聽處理的實現(xiàn),確保了方案的可操作性,需要的朋友可以參考下2024-12-12