MySQL的insert ignore与replace into不同
以前從來沒有接觸過replace into這個語法,但是卻看到很多人都在使用這個語法,并且應用在很多生產環境中,于是我也去學習了一下repalce into的用法。
關于replace
一句話:正常情況下表中有PRIMARY KEY或UNIQUE索引,新數據會替換老的數據。沒有老數據則insert該數據。
REPLACE的運行與INSERT很相像。只有一點除外,如果表中的一個舊記錄與一個用于PRIMARY KEY或一個UNIQUE索引的新記錄具有相同的值,則在新記錄被插入之前,舊記錄被刪除。使用REPLACE相當于對原有的數據(在PRIMARY KEY或UNIQUE索引下有值的數據)進行delete操作,然后再insert操作。為了能夠使用REPLACE,您必須同時擁有表的INSERT和DELETE權限。
除非表有一個PRIMARY KEY或UNIQUE索引,否則,使用一個REPLACE語句沒有意義。該語句會與INSERT相同,因為沒有索引被用于確定是否新行復制了其它的行。
replace的使用一般是:只想對數據在數據庫中保存一份,不想出現重復的數據(重復的主鍵、唯一索引),因為重復的數據不是我們想要的,會給業務邏輯帶來麻煩。但是又要更新一些字段為最新的值,比如最后的檢查時間、任務的結果。
?
??REPLACE語句會返回一個數,來指示受影響的行的數目。該數是被刪除和被插入的行數的和
受影響的行數可以容易地確定是否REPLACE只添加了一行,或者是否REPLACE也替換了其它行:檢查該數是否為1(添加)或更大(替換)。
關于insert ignore
一句話:忽略執行insert語句出現的錯誤,不會忽略語法問題,但是忽略主鍵存在的情況。
如果沒有ignore關鍵字,那么在insert數據到一個表(在UNIQUE索引或PRIMARY KEY有相同值)中,這時會出現錯誤,語句執行失敗。但是使用了ignore關鍵字后,不會出現這個錯誤,并且新數據不會被插入到數據表中。
使用場景:比如一個多線程的插入數據表,為了不讓多個線程向表中插入相同的數據,可以使用insert ignore來忽略重復的數據。有比如,你的程序down了,需要重新運行,那么會重新拉取數據再insert到數據庫中,這個時候可能會存在重復的數據導致錯誤,ignore就可以解決這個問題。
兩者的一些聯系區別
聯系:
不想向數據表中插入相同的主鍵、unique索引時,可以使用replace或insert ignore,來避免重復的數據。
區別:
- replace相當于delete然后insert,會有對數據進行寫的過程。
- insert ignore會忽略已經存在主鍵或unique索引的數據,而不會有數據的修改。
使用場景:
- 如果不需要對數據進行更新值,那么推薦使用insert ignore,比如:多線程的插入相同的數據。
- 如果需要對數據進行更新最新的值,那么使用replace,比如:任務的結果,最后的更新時間。
后話:自從知道了有insert ignore,我再也不會一股勁的使用replace了,媽媽再也不用擔心數據庫的頻繁刪寫操作。
參考資料
轉載于:https://www.cnblogs.com/conanwang/p/5888274.html
總結
以上是生活随笔為你收集整理的MySQL的insert ignore与replace into不同的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 5878 I Count Two
- 下一篇: 内存泄漏的常见应用领域