mysql replace into用法詳細說明

REPLACE的運行與INSERT很類似。只有一點例外,假如表中的一箇舊記錄與一個用於PRIMARY索引

KEY或一個UNIQUE索引的新記錄具備相同的值,則在新記錄被插入以前,舊記錄被刪除。 
注意,除非表有一個PRIMARY KEY或UNIQUE索引,不然,使用一個REPLACE語句沒有意義。該table

語句會與INSERT相同,由於沒有索引被用於肯定是否新行復制了其它的行。權限


全部列的值均取自在REPLACE語句中被指定的值。全部缺失的列被設置爲各自的默認值,這引用

和INSERT同樣。您不能從當前行中引用值,也不能在新行中使用值。若是您使用一個例如「數據

SET col_name = col_name + 1」的賦值,則對位於右側的列名稱的引用會被做爲DEFAULTtab

(col_name)處理。所以,該賦值至關於SET col_name = DEFAULT(col_name) + 1。co

爲了可以使用REPLACE,您必須同時擁有表的INSERT和DELETE權限。錯誤


REPLACE語句會返回一個數,來指示受影響的行的數目。該數是被刪除和被插入的行數的和ab

。若是對於一個單行REPLACE該數爲1,則一行被插入,同時沒有行被刪除。若是該數大於1

,則在新行被插入前,有一個或多箇舊行被刪除。若是表包含多個惟一索引,而且新行復制

了在不一樣的惟一索引中的不一樣舊行的值,則有多是一個單一行替換了多箇舊行。


受影響的行數能夠容易地肯定是否REPLACE只添加了一行,或者是否REPLACE也替換了其它行

:檢查該數是否爲1(添加)或更大(替換)。

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 …

REPLACE INTO `table` (`unique_column`,`num`) VALUES ('$unique_value',$num);跟INSERT INTO `table` (`unique_column`,`num`) VALUES('$unique_value',$num) ON DUPLICATE UPDATE num=$num;仍是有些區別的.
區別就是replace into的時候會刪除老記錄。若是表中有一個自增的主鍵。
那麼就要出問題了。

首先,由於新紀錄與老記錄的主鍵值不一樣,因此其餘表中全部與本表老數據主鍵id創建的關聯所有會被破壞。

其次,就是,頻繁的REPLACE INTO 會形成新紀錄的主鍵的值迅速增大。總有一天。達到最大值後就會由於數據太大溢出了。就無法再插入新紀錄了。數據表滿了,不是由於空間不夠了,而是由於主鍵的值無法再增長了。

相關文章
相關標籤/搜索