在實(shí)際的業(yè)務(wù)場(chǎng)景中,經(jīng)常會(huì)遇到這樣的需求:插入某條記錄,但如果數(shù)據(jù)庫(kù)中有這條記錄的話那就作相應(yīng)的處理(忽略或者更新),正常情況下需要程序分多個(gè)步驟去完成這樣的需求,在MySQL中提供了兩種方式去簡(jiǎn)化這個(gè)操作,那就是使用insert...on duplicate key update、replace into和insert ignore into
目錄
- 一、insert...on duplicate key update的使用
- 二、replace into的使用
- 三、insert ignore into的使用
一、insert...on duplicate key update的使用
1、首先需要在判斷條件上加上唯一索引,這個(gè)索引最好是單個(gè)字段的(比如是ID)
2、使用例子
INSERT INTO tb_addrbook(ID,name,mobile) VALUE('1001','小李','13112345678') ON DUPLICATE KEY UPDATE name= '小李',mobile='13112345678'
解釋:
在on duplicate key update后面,name和mobile字段是需要更新的內(nèi)容,語(yǔ)句總體的意思是插入一條ID為1001的數(shù)據(jù),名稱是小李,電話是13112345678,如果數(shù)據(jù)表中有一條數(shù)據(jù)的ID是1001,那么將原來(lái)的name和mobile分別改為小李和13112345678(直接更新數(shù)據(jù))
二、replace into的使用
1、使用方式同上,首先還是要有作為唯一判斷的條件,并在這個(gè)字段上加上唯一索引,索引最好是單個(gè)字段的
2、使用例子:
REPLACE INTO tb_addrbook(ID,name,mobile) VALUE('1001','小李','13112345678')
解釋:
replace into的使用方式更直接粗暴,而且更容易懂,因?yàn)檎Z(yǔ)法跟insert into是一樣的,只是insert改成了replace,其工作原理是會(huì)將原來(lái)的1001的數(shù)據(jù)刪除,然后再插入新添加的數(shù)據(jù)(先刪除后插入),需要注意的是,如果ID是自動(dòng)遞增的,唯一判斷條件是另外一個(gè)自動(dòng),那么更新之后,自增ID是會(huì)變的(比如原來(lái)ID是1,那么執(zhí)行完replace into后ID就是2了)
三、insert ignore into的使用
1、使用方式同上,首先還是要有作為唯一判斷的條件,并在這個(gè)字段上加上唯一索引,索引最好是單個(gè)字段的
2、使用例子:
INSERT IGNORE INTO tb_addrbook(ID,name,mobile) VALUE('1001','小李','13112345678')
解釋:
INSERT IGNORE INTO的使用方式也跟insert into一樣,只是在判斷到有相同的數(shù)據(jù)之后直接跳過(guò),不更新也不刪除插入,如上面語(yǔ)句的意思就是如果插入到的表中有1001這條數(shù)據(jù)的話,那么就直接跳過(guò),不作任何操作
有關(guān)on dunplicate key update 會(huì)出現(xiàn)的鎖問(wèn)題:
https://blog.csdn.net/pml18710973036/article/details/78452688
參考:
https://blog.csdn.net/dazhi_100/article/details/50133757