MySQL replace into 用法
MySQL replace into 用法(insert into 的增強版)
在向表中插入數據的時候,經常遇到這樣的情況:1. 首先判斷數據是否存在; 2. 如果不存在,則插入;3.如果存在,則更新。
在 SQL Server 中可以這樣處理:
那么 MySQL 中如何實現這樣的邏輯呢?別著急!MySQL 中有更簡單的方法:?replace into
replace into t(id, update_time) values(1, now());或
replace into t(id, update_time) select 1, now();replace into?跟 insert 功能類似,不同點在于:replace into?首先嘗試插入數據到表中, 1. 如果發現表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然后插入新的數據。 2. 否則,直接插入新數據。
要注意的是:插入數據的表必須有主鍵或者是唯一索引!否則的話,replace into?會直接插入數據,這將導致表中出現重復的數據。
MySQL replace into 有三種形式:
前兩種形式用的多些。其中 “into” 關鍵字可以省略,不過最好加上 “into”,這樣意思更加直觀。另外,對于那些沒有給予值的列,MySQL 將自動為這些列賦上默認值。
replace詳細說明:
參考資料:http://dev.mysql.com/doc/refman/5.0/en/replace.html
REPLACE作品完全一樣?的INSERT,但如果舊表中的行具有相同的值作為一個新行?PRIMARY KEY或UNIQUE?索引,舊行插入新行之前刪除。請參見?第13.2.5節,“INSERT語法”。
REPLACE是一個MySQL擴展SQL標準。它要么插入或刪除?和插入。另一個MySQL擴展到標準的SQL,要么插入或?更新?-請參閱?第13.2.5.3,“INSERT ... ON DUPLICATE KEY UPDATE的SQL語法”。
請注意,除非表有一個PRIMARY KEY或?UNIQUE索引,使用?REPLACE語句是沒有意義的。它變成相當于INSERT,因為要使用沒有索引,以確定新的行是否會復制另外一個。
值的所有列都來自于指定的值?REPLACE語句。任何缺失的列被設置為各自的默認值,就像發生在?INSERT。您不能從當前行參考值,并使用他們的新行。如果您使用的作業,如設置?COL_NAME?=?COL_NAME?+1,參考列名在右邊被視為?默認(COL_NAME),所以轉讓相當于SET?COL_NAME?= DEFAULT(COL_NAME)+1。
要使用REPLACE,您必須同時擁有INSERT和?DELETE的表的權限。
在REPLACE語句返回一個數來表示受影響的行數。這是刪除和插入的行的總和。如果計數1為單排?更換,連續被插入并沒有行被刪除。如果計數插入新行之前大于1,一個或多個舊行被刪除。這是可能的單行替換多個舊行如果表包含多個唯一索引,并且新行復制的值在不同的唯一索引中的不同舊行。
受影響的行數可以很容易地確定是否?REPLACE只添加了一行,或者是否也換成任何行:檢查是否計數1(添加)或更大(替換)。
如果您正在使用C API時,受影響的行數可以通過獲得?mysql_affected_rows()函數。
目前,您不能更換成一個表,并從同一個表中的子查詢中選擇。
MySQL使用下列算法?REPLACE(和LOAD DATA ... REPLACE):
嘗試插入新行插入表
而插入失敗,因為發生在主鍵或唯一索引的重復鍵錯誤:
從表中刪除了重復的鍵值沖突的行
再次嘗試插入新行插入表
可能的是在一個重復鍵錯誤的情況下,存儲引擎可以執行REPLACE作為更新,而不是刪除加插入,但語義是相同的。有沒有比如何存儲引擎增加一個可能的差異其他用戶可見的效果?Handler_?XXX狀態變量。
總結
以上是生活随笔為你收集整理的MySQL replace into 用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ON DUPLICATE KEY UPD
- 下一篇: 什么时候使用 InheritableTh