文章綜合了大量的關(guān)于sql replace into 相關(guān)文章,把它們的用法與優(yōu)點都集中于這篇文章,有需要使用些命令的朋友可以仔細的看看.
以下是所用算法的更詳細的說明,該算法也用于LOAD DATA...REPLACE.
1. 嘗試把新行插入到表中.
2. 當因為對于主鍵或唯一關(guān)鍵字出現(xiàn)重復關(guān)鍵字錯誤而造成插入失敗時:
a. 從表中刪除含有重復關(guān)鍵字值的沖突行.
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 使用’)
結(jié)果:受影響的行數(shù):2
SELECT * FROM fanwe_order WHERE sn=’測試replace into 使用’
結(jié)果:查出 一行記錄
測試方式二,插入主鍵值是重復的,將插入id指定為34,這樣不與數(shù)據(jù)表中的id有重復現(xiàn)象,之后運行查詢:
REPLACE INTO fanwe_order(id,sn) VALUES(’34′,’測試replace into 使用’)
結(jié)果:沒有新插入一條數(shù)據(jù),還是替換了原來的那行,id從33變?yōu)?4.
原因分析:
手冊上提到,如果表中的一個舊記錄與一個用于PRIMARY KEY或一個UNIQUE索引的新記錄具有相同的值,除非表有一個PRIMARY KEY或UNIQUE索引,否則,使用一個REPLACE語句沒有意義,剛才測試的例子中。id是主鍵,sn是唯一索引。測試方式一是出現(xiàn)主鍵值一樣,測試方式二是出現(xiàn)唯一索引值一樣。兩種情況都出現(xiàn)了replace.
理解:插入數(shù)據(jù)的時候,假如遇到主鍵值或者唯一索引鍵值一樣的話。那么就使用替代(replace單詞的含義反應了其作用)的方式,刪掉原來的。以當前插入的行進行替代(所以需要同時具有insert和delete權(quán)限),先刪除后插入新的。正好說明了我看到的現(xiàn)象:顯示受影響的行數(shù)是2,兩種情況之一使用replace語句才會出現(xiàn)替換:1.主鍵值相同 2.索引鍵值相同.
為了能夠使用REPLACE,您必須同時擁有表的INSERT和DELETE權(quán)限。
REPLACE語句會返回一個數(shù),來指示受影響的行的數(shù)目。該數(shù)是被刪除和被插入的行數(shù)的和。如果對于一個單行REPLACE該數(shù)為1,則一行被插入,同時沒有行被刪除。如果該數(shù)大于1,則在新行被插入前,有一個或多個舊行被刪除。如果表包含多個唯一索引,并且新行復制了在不同的唯一索引中的不同舊行的值,則有可能是一個單一行替換了多個舊行。
受影響的行數(shù)可以容易地確定是否REPLACE只添加了一行,或者是否REPLACE也替換了其它行:檢查該數(shù)是否為1(添加)或更大(替換)。
MySQL replace into 用法(insert into 的增強版)
REPLACE依賴于表中的主鍵或唯一索引,如果一個表中存在的記錄與用于PRIMARY KEY或UNIQUE索引的新記錄具有相同的值,則在新記錄被插入之前,舊記錄被刪除。
依賴主鍵或索引Mysql能夠?qū)崿F(xiàn)快速的判斷,使用REPLACE,需要同時擁有表的INSERT和DELETE權(quán)限。
Replace首先嘗試把新行插入到表中,如果因為主鍵或唯一鍵出現(xiàn)沖突而造成插入失敗時,則從表中刪除含有重復關(guān)鍵字值的沖突行,然后嘗試把新行插入到表中。
在 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 中如何實現(xiàn)這樣的邏輯呢?別著急,MySQL 中有更簡單的方法:replace into,代碼如下:
- replace
- into
- t(id, update_time) values(1, now());
- --Vevb.com
- --或
- replace
- into
- t(id, update_time) select 1, now();
replace into 跟 insert 功能類似,不同點在于:replace into 首先嘗試插入數(shù)據(jù)到表中,1. 如果發(fā)現(xiàn)表中已經(jīng)有此行數(shù)據(jù)(根據(jù)主鍵或者唯一索引判斷)則先刪除此行數(shù)據(jù),然后插入新的數(shù)據(jù),2.否則,直接插入新數(shù)據(jù).
新聞熱點
疑難解答
圖片精選