這兩個語句都是為了實現:如果沒有記錄則插入,如果有記錄則更新。有點需要注意,這兩個語句都是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只是更新部分欄位,對於未被更新的欄位不會變化(不會強制修改為默 認值)。