日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL replace into 用法

發(fā)布時間:2024/1/17 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL replace into 用法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MySQL replace into 用法(insert into 的增強版)

在向表中插入數據的時候,經常遇到這樣的情況:1. 首先判斷數據是否存在; 2. 如果不存在,則插入;3.如果存在,則更新。

在 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());

    replace into t(id, update_time) select 1, now();

    replace into?跟 insert 功能類似,不同點在于:replace into?首先嘗試插入數據到表中, 1. 如果發(fā)現(xiàn)表中已經有此行數據(根據主鍵或者唯一索引判斷)則先刪除此行數據,然后插入新的數據。 2. 否則,直接插入新數據。

    要注意的是:插入數據的表必須有主鍵或者是唯一索引!否則的話,replace into?會直接插入數據,這將導致表中出現(xiàn)重復的數據。

    MySQL 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, ...
  • 前兩種形式用的多些。其中 “into” 關鍵字可以省略,不過最好加上 “into”,這樣意思更加直觀。另外,對于那些沒有給予值的列,MySQL 將自動為這些列賦上默認值。

    replace詳細說明:

    參考資料:http://dev.mysql.com/doc/refman/5.0/en/replace.html

    REPLACE作品完全一樣?的INSERT,但如果舊表中的行具有相同的值作為一個新行?PRIMARY KEYUNIQUE?索引,舊行插入新行之前刪除。請參見?第13.2.5節(jié),“INSERT語法”

    REPLACE是一個MySQL擴展SQL標準。它要么插入或刪除?和插入。另一個MySQL擴展到標準的SQL,要么插入或?更新?-請參閱?第13.2.5.3,“INSERT ... ON DUPLICATE KEY UPDATE的SQL語法”

    請注意,除非表有一個PRIMARY KEY或?UNIQUE索引,使用?REPLACE語句是沒有意義的。它變成相當于INSERT,因為要使用沒有索引,以確定新的行是否會復制另外一個。

    值的所有列都來自于指定的值?REPLACE語句。任何缺失的列被設置為各自的默認值,就像發(fā)生在?INSERT您不能從當前行參考值,并使用他們的新行。如果您使用的作業(yè),如設置?COL_NAME?=?COL_NAME?+1,參考列名在右邊被視為?默認(COL_NAME,所以轉讓相當于SET?COL_NAME?= DEFAULT(COL_NAME)+1

    要使用REPLACE,您必須同時擁有INSERT和?DELETE的表的權限。

    REPLACE語句返回一個數來表示受影響的行數。這是刪除和插入的行的總和。如果計數1為單排?更換,連續(xù)被插入并沒有行被刪除。如果計數插入新行之前大于1,一個或多個舊行被刪除。這是可能的單行替換多個舊行如果表包含多個唯一索引,并且新行復制的值在不同的唯一索引中的不同舊行。

    受影響的行數可以很容易地確定是否?REPLACE只添加了一行,或者是否也換成任何行:檢查是否計數1(添加)或更大(替換)。

    如果您正在使用C API時,受影響的行數可以通過獲得?mysql_affected_rows()函數。

    目前,您不能更換成一個表,并從同一個表中的子查詢中選擇。

    MySQL使用下列算法?REPLACE(和LOAD DATA ... REPLACE):

  • 嘗試插入新行插入表

  • 而插入失敗,因為發(fā)生在主鍵或唯一索引的重復鍵錯誤:

  • 從表中刪除了重復的鍵值沖突的行

  • 再次嘗試插入新行插入表

  • 可能的是在一個重復鍵錯誤的情況下,存儲引擎可以執(zhí)行REPLACE作為更新,而不是刪除加插入,但語義是相同的。有沒有比如何存儲引擎增加一個可能的差異其他用戶可見的效果?Handler_?XXX狀態(tài)變量。

    總結

    以上是生活随笔為你收集整理的MySQL replace into 用法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。