MySQL的insert ignore與replace into不同

來源:互聯網
上載者:User

標籤:

以前從來沒有接觸過replace into這個文法,但是卻看到很多人都在使用這個文法,並且應用在很多生產環境中,於是我也去學習了一下repalce into的用法。

關於replace

一句話:正常情況下表中有PRIMARY KEYUNIQUE索引,新資料會替換老的資料。沒有老資料則insert該資料。

REPLACE的運行與INSERT很相像。只有一點除外,如果表中的一箇舊記錄與一個用於PRIMARY KEY或一個UNIQUE索引的新記錄具有相同的值,則在新記錄被插入之前,舊記錄被刪除。使用REPLACE相當於對原有的資料(在PRIMARY KEY或UNIQUE索引下有值的資料)進行delete操作,然後再insert操作。為了能夠使用REPLACE,您必須同時擁有表的INSERTDELETE許可權。

除非表有一個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索引時,可以使用replaceinsert ignore,來避免重複的資料。

區別:

  • replace相當於delete然後insert,會有對資料進行寫的過程。
  • insert ignore會忽略已經存在主鍵或unique索引的資料,而不會有資料的修改。

使用情境:

  • 如果不需要對資料進行更新值,那麼推薦使用insert ignore,比如:多線程的插入相同的資料。
  • 如果需要對資料進行更新最新的值,那麼使用replace,比如:任務的結果,最後的更新時間。

後話:自從知道了有insert ignore,我再也不會一股勁的使用replace了,媽媽再也不用擔心資料庫的頻繁刪寫操作。

參考資料

MySQL的insert ignore與replace into不同

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.