班級(jí)網(wǎng)站素材下載百度推廣有哪些推廣方式
前言
這個(gè)也是我們經(jīng)??赡軙?huì)使用到的相關(guān)的特殊語(yǔ)句?
當(dāng)插入數(shù)據(jù)存在?唯一索引 或者 主鍵索引 相關(guān)約束的時(shí)候,?如果存在?約束沖突,?則更新目標(biāo)記錄?
這個(gè)處理是類似于?邏輯上的 save?操作?
insert into tz_test_02 (field1, field2) values ('field11', '11')
on duplicate key update field2 = '22';
?
?
該操作?整體邏輯類似于如下
Sting key = entity.key();
Object entityInDb = repository.findByKey(key);
if(entityInDb == null) {repository.insert(entity);return ;
}
repository.updateByKey(entity);
?
?
我們這里主要是從?mysql?源碼的層面來(lái)看一下?mysql?這邊是怎么處理的?
當(dāng)然?相對(duì)比較簡(jiǎn)單,?大體的流程?和上面 一樣,?我們會(huì)忽略?大部分的細(xì)節(jié)
相對(duì)來(lái)說(shuō)?比較簡(jiǎn)單,?不花費(fèi)太多的信息來(lái)描述?
?
測(cè)試數(shù)據(jù)表如下?
CREATE TABLE `tz_test_02` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`field1` varchar(128) DEFAULT NULL,`field2` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `field_1` (`field1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8
?
?
服務(wù)器這邊的數(shù)據(jù)插入
這里會(huì)先進(jìn)行數(shù)據(jù)插入,?如果插入失敗?走相關(guān)的補(bǔ)償處理
?
然后在插入索引記錄的時(shí)候,?由于?索引的唯一約束,?插入失敗,?這里響應(yīng)?DB_DUPLICATE_KEY 的錯(cuò)誤?
?
?
服務(wù)器這邊數(shù)據(jù)更新
在補(bǔ)償?shù)奶幚砝锩??根據(jù)目標(biāo)條件對(duì)目標(biāo)記錄進(jìn)行更新?
這里相當(dāng)于執(zhí)行的是?是一個(gè) “update tz_test_02 set field2 = '22' where field1 = 'field11';”
?
?
完
?
?
?