以下是所用算法的更詳細的說明(該算法也用於LOAD DATA...REPLACE):
1. 嘗試把新行插入到表中
2. 當因為對於主鍵或唯一關鍵字出現重復關鍵字錯誤而造成插入失敗時:
a. 從表中刪除含有重復關鍵字值的沖突行
b. 再次嘗試把新行插入到表中
使用格式:
代碼如下 復制代碼
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
或:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
或:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
SELECT ...
id 是主鍵
測試方式一,插入索引值是一樣的:
代碼如下 復制代碼REPLACE INTO fanwe_order(id,sn) VALUES(’33′,’測試replace into 使用’) 結果:受影響的行數:2
SELECT * FROM fanwe_order WHERE sn=’測試replace into 使用’
結果:查出 一行記錄
測試方式二,插入主鍵值是重復的:
將插入id指定為34。這樣不與數據表中的id有重復現象,之後運行查詢
REPLACE INTO fanwe_order(id,sn) VALUES(’34′,’測試replace into 使用’)
結果:沒有新插入一條數據。還是替換了原來的那行。id從33變為34
原因分析:
手冊上提到,如果表中的一個舊記錄與一個用於PRIMARY KEY或一個UNIQUE索引的新記錄具有相同的值。
意,除非表有一個PRIMARY KEY或UNIQUE索引,否則,使用一個REPLACE語句沒有意義。
剛才測試的例子中。id是主鍵,sn是唯一索引。測試方式一是出現主鍵值一樣,測試方式二是出現唯一索
引值一樣。兩種情況都出現了replace
理解:插入數據的時候,假如遇到主鍵值或者唯一索引鍵值一樣的話。那麼就使用替代(replace單詞的含義反應了其作用)的方式,刪掉原來的。以當前插入的行進行替代(所以需要同時具有insert和delete權限)
先刪除後插入新的。正好說明了我看到的現象:顯示受影響的行數是2
兩種情況之一使用replace語句才會出現替換:1.主鍵值相同 2.索引鍵值相同
為了能夠使用REPLACE,您必須同時擁有表的INSERT和DELETE權限。
REPLACE語句會返回一個數,來指示受影響的行的數目。該數是被刪除和被插入的行數的和。如果對於一個單行REPLACE該數為1,則一行被插入,同時沒有行被刪除。如果該數大於1,則在新行被插入前,有一個或多個舊行被刪除。如果表包含多個唯一索引,並且新行復制了在不同的唯一索引中的不同舊行的值,則有可能是一個單一行替換了多個舊行。
受影響的行數可以容易地確定是否REPLACE只添加了一行,或者是否REPLACE也替換了其它行:檢查該數是否為1(添加)或更大(替換)。
MySQL replace into 用法(insert into 的增強版)
REPLACE依賴於表中的主鍵或唯一索引,如果一個表中存在的記錄與用於PRIMARY KEY或UNIQUE索引的新記錄具有相同的值,則在新記錄被插入之前,舊記錄被刪除。
依賴主鍵或索引Mysql能夠實現快速的判斷,使用REPLACE,需要同時擁有表的INSERT和DELETE權限。
Replace首先嘗試把新行插入到表中,如果因為主鍵或唯一鍵出現沖突而造成插入失敗時,則從表中刪除含有重復關鍵字值的沖突行,然後嘗試把新行插入到表中。
在 SQL Server 中可以這樣處理:
代碼如下 復制代碼 if not exists (select 1 from t where id = 1)
insert into
t(id, update_time) values(1, getdate())
else
update t set update_time = getdate() where id = 1
那麼 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. 否則,直接插入新數據。