標籤:
以前從來沒有接觸過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了,媽媽再也不用擔心資料庫的頻繁刪寫操作。
參考資料
MySQL的insert ignore與replace into不同