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