MySQL Replace INTO的高階使用

2021-08-26 06:01:57 字數 1551 閱讀 4849

replace的執行與insert很相像。只有一點除外,如果表中的乙個舊記錄與乙個用於primary key或乙個unique索引的新記錄具有相同的值,則在新記錄被插入之前,舊記錄被刪除。請參見13.2.4節,「insert語法」。

注意,除非表有乙個primary key或unique索引,否則,使用乙個replace語句沒有意義。該語句會與insert相同,因為沒有索引被用於確定是否新行複製了其它的行。

所有列的值均取自在replace語句中被指定的值。所有缺失的列被設定為各自的預設值,這和insert一樣。您不能從當前行中引用值,也不能在新行中使用值。如果您使用乙個例如「set col_name = col_name + 1」的賦值,則對位於右側的列名稱的引用會被作為default(col_name)處理。因此,該賦值相當於set col_name = default(col_name) + 1。

使用replace into,必須同時擁有表的insert和delete許可權。

replace語句會返回乙個數,來指示受影響的行的數目。該數是被刪除和被插入的行數的和。如果對於乙個單行replace該數為1,則一行被插入,同時沒有行被刪除。如果該數大於1,則在新行被插入前,有乙個或多個舊行被刪除。如果表包含多個唯一索引,並且新行複製了在不同的唯一索引中的不同舊行的值,則有可能是乙個單一行替換了多個舊行。

受影響的行數可以容易地確定是否replace只新增了一行,或者是否replace也替換了其它行:檢查該數是否為1(新增)或更大(替換)。

如果您正在使用c api,則可以使用mysql_affected_rows()函式獲得受影響的行數。

目前,您不能在乙個子查詢中,向乙個表中更換,同時從同乙個表中選擇。

以下是所用演算法的更詳細的說明(該演算法也用於load data…replace):

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

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

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

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

舉例:

create table  `test`.`n` (

`id` int(10) unsigned not null auto_increment,

`time` varchar(45) not null,

primary key (`id`)

) engine=myisam

replace into n (id,time) values(1,now());
select * from n ;
測試可見,有primary-key的情況下,使用replace into 不會造成id increment持續增長。

1, '2011-09-23 12:52:50'

2, '2011-09-23 12:46:34'

10, '2011-09-23 12:46:46'

總結:使用replace into 時,必須考慮包含主鍵的情況下操作,從而不會造成主鍵持續增長!

Android TextView高階特性使用

之所以寫這篇文章是因為今天修改launcher裡面介面字型的時候,遇到些問題,而launcher的圖示都是textview做的,因此查詢了一些textview的特殊屬性。1 文字陰影 edited by mythou android shadowcolor 000000 android shadow...

Golang併發模式 channel高階使用

再pipeline的情況中,我們通過done來通知goroutine結束。但是,如果我們處理的channel來自系統其它分散的部分,則無法通過done來控制,因為我們不知道資料流終止的時間,此時需要引入or done機制。or done機制本質上是對外界資料channel的乙個封裝,以便我們可以實際...

Java中高階陣列以及Arrays類的使用

1 陣列高階以及arrays 1 排序 a 氣泡排序 相鄰元素兩兩比較,大的往後放,第一次完畢,最大值出現在了最大索引處。同理,其他的元素就可以排好。public static void bubblesort int arr b 選擇排序 把0索引的元素,和索引1以後的元素都進行比較,第一次完畢,最...