国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

sql replace into 用法與實現(xiàn)語句

2024-07-24 12:39:12
字體:
供稿:網(wǎng)友

文章綜合了大量的關(guān)于sql replace into 相關(guān)文章,把它們的用法與優(yōu)點都集中于這篇文章,有需要使用些命令的朋友可以仔細的看看.

以下是所用算法的更詳細的說明,該算法也用于LOAD DATA...REPLACE.

1. 嘗試把新行插入到表中.

2. 當因為對于主鍵或唯一關(guān)鍵字出現(xiàn)重復關(guān)鍵字錯誤而造成插入失敗時:

a. 從表中刪除含有重復關(guān)鍵字值的沖突行.

b. 再次嘗試把新行插入到表中.

使用格式,代碼如下:

  1. REPLACE [LOW_PRIORITY | DELAYED] 
  2. [INTO] tbl_name [(col_name,...)] 
  3. VALUES ({expr | DEFAULT},...),(...),... 
  4. --或: 
  5.  
  6. REPLACE [LOW_PRIORITY | DELAYED] 
  7. [INTO] tbl_name 
  8. SET col_name={expr | DEFAULT}, ... 
  9. ==或: 
  10.  
  11. REPLACE [LOW_PRIORITY | DELAYED] 
  12. [INTO] tbl_name [(col_name,...)] 
  13. 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 中可以這樣處理,代碼如下:

  1.   if not exists (select 1 from t where id = 1) 
  2.      insert into 
  3. t(id, update_time) values(1, getdate()) 
  4.   else 
  5.      update t set update_time = getdate() where id = 1 

那么 MySQL 中如何實現(xiàn)這樣的邏輯呢?別著急,MySQL 中有更簡單的方法:replace into,代碼如下:

  1. replace 
  2.  into 
  3.  t(id, update_time) values(1, now()); 
  4. --Vevb.com 
  5. --或 
  6.  
  7. replace 
  8.  into 
  9.  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ù).

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 台前县| 安阳市| 屏南县| 株洲县| 杨浦区| 安国市| 磐安县| 寿阳县| 太和县| 湄潭县| 东乡| 辛集市| 焉耆| 亚东县| 三都| 罗源县| 湘乡市| 三穗县| 芮城县| 建始县| 平山县| 灵川县| 望城县| 辽阳县| 永泰县| 河津市| 西畴县| 深圳市| 山东| 鄂尔多斯市| 文登市| 沾化县| 互助| 盐边县| 牡丹江市| 竹北市| 保康县| 竹溪县| 清流县| 东阳市| 武定县|