本篇文章為大家展示了MySQL Replace into和Insert into duplicate key update的對比分析 ,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
華容網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)于2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
有些同學(xué)對MYSQL中兩個看似相同功能的語句,在使用中感到疑惑,到底是功能重復(fù)還是各有各自的特點(diǎn),我們需要弄清楚,并在合適的場合對他們加以利用。
我們通過幾個操作來詳細(xì)了解一下他們的使用方式和異同點(diǎn)
情況一, 判斷當(dāng)前ID 是否存在 ID = 1 的記錄,如果有就更新數(shù)據(jù),如果沒有則插入記錄
這里如果我們單純使用UPDATE 語句,則會比較麻煩,首先我們需要判斷是否有 ID =1 的記錄,并且根據(jù)判斷后的結(jié)果進(jìn)行下一步的操作。
使用 replace 功能就可以滿足上面的要求
數(shù)據(jù)已經(jīng)被直接更改了,其實(shí)說準(zhǔn)確一點(diǎn),不是更新而是兩個操作,細(xì)心的同學(xué)應(yīng)該已經(jīng)發(fā)現(xiàn)了上面圖中的是 2 rows affected ,本來是一條數(shù)據(jù),怎么蹦出來兩條了。(注意2 rows affected)
Replace into 語句主要是通過主鍵和唯一索引來判斷數(shù)據(jù)的重復(fù)性,繼而 1 先刪除數(shù)據(jù),2 在插入數(shù)據(jù)的套路,實(shí)際是一條語句,完成了判斷,刪除,插入的操作,這樣的設(shè)計可以免除某些程序?qū)Ρ碇袛?shù)據(jù)處理的特殊需求。
可能熟悉MYSQL 的同學(xué)馬上又會問到,不是還有INSERT DUPLICATE KEY 的語句嗎,他和 replace into 語句又有什么不同?
需求2 , 現(xiàn)在需要在test 表中插入數(shù)據(jù),如果不重復(fù)就批量插入數(shù)據(jù),如果重復(fù),就更新其中某個值
很明顯,操作后重復(fù)的數(shù)據(jù)被更新,而沒有重復(fù)的數(shù)據(jù)被插入,那他同學(xué)所問的異同點(diǎn)在哪里?
1 replace into 是否可以批量插入數(shù)據(jù),insert duplicate key 都是可以的,
2 repace into 和 insert duplicate key 都可以更新數(shù)據(jù)
3 replace into 后面不可以接 select 語句 不可以, insert into duplicate key 是可以接入select 語句的 ,這在兩條語句在適用的環(huán)境上有了明顯的分割。
4 對數(shù)據(jù)庫表的操作不同,一個是 delete , insert ,一個僅僅是 insert update ,這在數(shù)據(jù)庫的物理操作層面也是根本的不同
最關(guān)鍵的一點(diǎn)不同是是對自增鍵的處理上,如果我們不指定自增主鍵的數(shù)據(jù),(這里假設(shè)我們使用的是通過唯一索引進(jìn)行判斷,而不是自增主鍵),那結(jié)果就大大的不同了,replace into 會刪除重復(fù)的行,在插入一行新的,而 insert into duplicate key 則是不會改變原有的自增主鍵,而是直接UPDATE,這在基于自增主鍵在應(yīng)用中使用時有根本性的不同,(ORACLE 的親們可能不大理解這個事情,因?yàn)镺RACLE 本身在設(shè)計之初就沒有自增主鍵,底層數(shù)據(jù)存儲設(shè)計不同,造成ORACLE 理解 SQL SERVER MYSQL 某些數(shù)據(jù)表設(shè)計和處理上困難,同理SQL SERVER MYSQL 要理解 ORACLE 在某些數(shù)據(jù)表設(shè)計也有障礙),言歸正傳MYSQL 的程序員在使用這兩條語句我總結(jié)了相關(guān)使用的場景。
1 少數(shù)據(jù)量非大批量數(shù)據(jù)的更新,并且整行數(shù)據(jù)都要變化的情況下,可以采用REPLACE INTO ,并且如果主鍵和應(yīng)用有緊密聯(lián)系,需要指定主鍵值,否則原數(shù)據(jù)行主鍵消失,這在某些與應(yīng)用中是有用的,因?yàn)榫褪遣灰械闹麈I,要一條新的ID包含新的值
2 大批量數(shù)據(jù)更新和插入,兩張或多張表,合并插入到一張表,并且去重,或者更新某個字段的VALUE 需要使用 INSERT INTO duplicate key update 語句
如果同樣大數(shù)據(jù)量的情況下,insert into duplicate key update 語句的性能要比 replace into 性能要好,兩次操作和 一次操作對操作性能的影響也是不言而喻。
注:測試中,5.X 中在 insert into duplicate key update 中關(guān)于自增主鍵的某些小問題,貌似在8.0上已經(jīng)消失了,具體還的在測試??磥?.0 的確是值得期待和擁有的。
上述內(nèi)容就是MYSQL Replace into和Insert into duplicate key update的對比分析 ,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。