依然是mentor要求(mentor是個(gè)嚴(yán)格的好人)践美,insert的時(shí)候最好不要直接插入信息,先根據(jù)unique key判斷信息是否已經(jīng)存在芋肠,如果存在就update蝇更,反之insert岭洲。
根據(jù)這個(gè)要求我們可以google到一個(gè)叫insert or update的方法宛逗,即on duplicate key update,只要設(shè)置一個(gè)unique key盾剩,就會自動根據(jù)其判斷是否已存在雷激。
這是一個(gè)很好的方法,如果你沒有使用auto increment主鍵告私。
測試發(fā)現(xiàn)對于自增主鍵來說屎暇,只要程序進(jìn)入insert,就會給主鍵值加一驻粟,也就是不論是程序?qū)嶋H進(jìn)行的是update操作根悼,還是insert操作出現(xiàn)錯(cuò)誤(eg:主鍵重復(fù)),自增主鍵都會加一格嗅。即如果第一次insert成功番挺,主鍵為1,中間出現(xiàn)了兩次update或是錯(cuò)誤屯掖,下一次insert的主鍵就會是4。
在update操作非常多的數(shù)據(jù)集中襟衰,或是在需要轉(zhuǎn)移數(shù)據(jù)庫次數(shù)較多的情況下贴铜,這樣的操作都會帶來非常嚴(yán)重的問題。
(在mentor的指導(dǎo)下我測試了最新的mariadb數(shù)據(jù)庫(10.3.6)瀑晒,這個(gè)問題依然沒有得到解決绍坝。查找發(fā)現(xiàn)replace into同樣會出現(xiàn)這種情況。)
最后我選擇的解決方式是將insert和update拆開苔悦,先用count查找某個(gè)記錄是否存在轩褐,count會返回該記錄的數(shù)值,根據(jù)數(shù)值是否為0判斷記錄是否存在玖详,如果以存在把介,就調(diào)用update,如果不存在就調(diào)用insert蟋座。
舉個(gè)栗子:
try{
if(employeeMapper.selectCount(key) !=0)
{
employeeMapper.updateByEmployee(employee);
}
else
? ? {
employeeMapper.insertSelective(employee);
}
}catch (DataAccessException e)
{
logger.info(e.getMessage());
}