myslq replace語句詳解

2021-06-20 15:37:48 字數 1627 閱讀 8395

replace的執行與insert很相似。只有一點例外,假如表中的乙個舊記錄與乙個用於primary

key或乙個unique索引的新記錄具有相同的值,則在新記錄被插入之前,舊記錄被刪除。 

注意,除非表有乙個primary key或unique索引,否則,使用乙個replace語句沒有意義。該

語句會與insert相同,因為沒有索引被用於確定是否新行複製了其它的行。

所有列的值均取自在replace語句中被指定的值。所有缺失的列被設定為各自的預設值,這

和insert一樣。您不能從當前行中引用值,也不能在新行中使用值。如果您使用乙個例如「

set col_name = col_name + 1」的賦值,則對位於右側的列名稱的引用會被作為default

(col_name)處理。因此,該賦值相當於set col_name = default(col_name) + 1。

為了能夠使用replace,您必須同時擁有表的insert和delete許可權。

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

。如果對於乙個單行replace該數為1,則一行被插入,同時沒有行被刪除。如果該數大於1

,則在新行被插入前,有乙個或多個舊行被刪除。如果表包含多個唯一索引,並且新行複製

了在不同的唯一索引中的不同舊行的值,則有可能是乙個單一行替換了多個舊行。

受影響的行數可以容易地確定是否replace只新增了一行,或者是否replace也替換了其它行

:檢查該數是否為1(新增)或更大(替換)。

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

2. 當因為對於主鍵或唯一關鍵字出現重複關鍵字錯誤而造成插入失敗時:

a. 從表中刪除含有重複關鍵字值的衝突行

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

replace [low_priority | delayed]

[into] tbl_name [(col_name,...)]

values (,…),(…),…

或:replace [low_priority | delayed]

[into] tbl_name

set col_name=, …

或: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 會造成新紀錄的主鍵的值迅速增大。

總有一天。達到最大值後就會因為資料太大溢位了。就沒法再插入新紀錄了。資料表滿了,不是因為空間不夠了,而是因為主鍵的值沒法再增加了。

來自:

oracle case when 語句的用法詳解

1.case when 表示式有兩種形式 複製 如下 簡單case函式 case when 1 then 男 when 2 then 女 else 其他 end case搜尋函式 case whe程式設計客棧n 1 then 男 when 2 then 女 else 其他 end 2.case wh...

MySQL Order by 語句用法與優化詳解

order by語句是用來排序的,經常我們會使用到order by來進行排序,下面我給大家來講講order by用法與優化排序,有需要的同學可參考 複製 如下 select column name s from table name order by column name 例子 sql建立 複製 ...

Sqlite3中replace語句用法詳解

由於自己的孤陋寡聞,也由於之前的專案中,很少參與過資料庫模組的開發,以至於前幾天才知道sqlite資料庫也支援replace語句。本文主要講解在sqlite中replace語句的行為,也算是學習筆記。此外,replace語句和update語句有相似的地方,但是也有很多不同之處。本文還要對比一下sql...