Mysql中Insert into xxx on duplicate key update和REPLACE INTO使用

來源:互聯網
上載者:User

這兩個語句都是為了實現:如果沒有記錄則插入,如果有記錄則更新。有點需要注意,這兩個語句都是Mysql特有的語句,不屬於標準sql。它的實作類別似於以下寫法:

select 1 from t where id=1;程式判斷是否存在值if(存在){  update t set update_time = '2012' where id = 1}else{   insert into t(id, update_time) values(1,'2012')}  

1)replace into實現上述邏輯:

replace into t(id, update_time) values(1, '2012');或:replace into t(id, update_time) select 1, '2012';

  replace into執行過程:

首先嘗試插入資料到表中, 1. 如果發現表中已經有此行資料(根據主鍵或者唯一索引判斷)則先刪除此行資料,然後插入新的資料。 2. 否則,直接插入新資料。

要注意的是:插入資料的表必須有主鍵或者是唯一索引!否則的話,replace into 會直接插入資料,這將導致表中出現重複的資料。

2)replace into 所有用法:

1. replace into tbl_name(col_name, ...) values(...)2. replace into tbl_name(col_name, ...) select ...3. replace into tbl_name set col_name=value, ...

3)Insert into xxx on duplicate key update 使用:

這個語句功能和REPLACE INTO功能相似,使用方法如下
table表中的id被定義為UNIQUE索引或PRIMARY KEY

INSERT INTO table (id,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

如果table表中原來就有id為1的記錄則更新c=c+1;如果b也是唯一列,執行邏輯是或的關係,id=xx or b =xx

4)兩個語句的使用上的區別

REPLACE INTO的寫法更加簡潔和直觀,在sql語句的開始就告訴了我們這個sql會發生什麼事情。而ON DUPLICATE KEY在茫茫語句中可能會被忽略掉...

但是REPLACE INTO必須要將每個欄位都賦以正確的值才行,否則欄位就會被寫入預設值。而ON DUPLICATE KEY則可以很靈活地只更新資料中的某些值。

如果表中不存在主鍵記錄,實現是相同的,但是如果表中存在主鍵記錄,replace相當於執行delete 和 insert兩條操作,而insert*update的相當於執行if exist do update else do insert操作。因此,如果replace填充的欄位不全,則會導致未被更新的欄位都會修改為預設值,並且如果有自增id的話,自增id會變化為最新的值(這樣如果是以自增id為標誌的話可能導致記錄丟失);而insert*update只是更新部分欄位,對於未被更新的欄位不會變化(不會強制修改為默 認值)。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.