MySql批量插入時如何不重復(fù)插入數(shù)據(jù)
前言
Mysql插入不重復(fù)的數(shù)據(jù),當(dāng)大數(shù)據(jù)量的數(shù)據(jù)需要插入值時,要判斷插入是否重復(fù),然后再插入,那么如何提高效率?解決的辦法有很多種,不同的場景解決方案也不一樣,數(shù)據(jù)量很小的情況下,怎么搞都行,但是數(shù)據(jù)量很大的時候,這就不是一個簡單的問題了。
一、insert ignore into
會忽略數(shù)據(jù)庫中已經(jīng)存在 的數(shù)據(jù),如果數(shù)據(jù)庫沒有數(shù)據(jù),就插入新的數(shù)據(jù),如果有數(shù)據(jù)的話就跳過當(dāng)前插入的這條數(shù)據(jù)。這樣就可以保留數(shù)據(jù)庫中已經(jīng)存在數(shù)據(jù),達(dá)到在間隙中插入數(shù)據(jù)的目的。
控制器方法:
/**
* 插入員工數(shù)據(jù)
*/
@PostMapping("save")
@ResponseBody
public CommonResult<Employee> save(@RequestBody Employee employee){
return employeeService.saveEmp(employee);
}
INSERT INTO 插入數(shù)據(jù)
<!--插入員工數(shù)據(jù)-->
<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
INSERT INTO t_employee(id, name, age, salary, department_id)
VALUES (#{id},#{name},#{age},#{salary},#{departmentId})
</insert>

我們新增一條主鍵ID為1的員工記錄。
當(dāng)我再發(fā)送一次請求的時候,會報SQL語句執(zhí)行錯誤,因為主鍵唯一,并且ID=1的記錄已經(jīng)存在了。

加上ignore,再次添加一條ID=1的員工記錄
INSERT IGNORE INTO

并沒有報錯,但是也沒有添加成功,忽略了重復(fù)數(shù)據(jù)的添加。
二、on duplicate key update
當(dāng)主鍵或者唯一鍵重復(fù)時,則執(zhí)行update語句。
ON DUPLICATE KEY UPDATE id = id
我們?nèi)稳徊迦隝D=1的員工記錄,并且修改一下其他字段(age=25):

查看數(shù)據(jù)庫記錄:

可以看到并沒有改變,數(shù)據(jù)也只有一條,并且返回了成功的提示。
這種方法有個前提條件,就是,需要插入的約束,需要是主鍵或者唯一約束(在你的業(yè)務(wù)中那個要作為唯一的判斷就將那個字段設(shè)置為唯一約束也就是unique key)。
擴(kuò)展:這種方式還有其他業(yè)務(wù)場景的需求->>>定時更新其他字段。
我們在員工表中,再加入一個時間字段:
private Date updateTime;

然后我們根據(jù)updateTime字段來插入數(shù)據(jù):
<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
INSERT INTO t_employee(id, name, age, salary, department_id,update_time)
VALUES (#{id},#{name},#{age},#{salary},#{departmentId},now())
ON DUPLICATE KEY UPDATE update_time = now()
</insert>



如果插入的時候需要更新其他字段(比如age),該怎么做呢?



三、replace into
如果存在primary or unique相同的記錄,則先刪除掉。再插入新記錄。
REPLACE INTO
<!--插入員工數(shù)據(jù)-->
<insert id="saveEmp" parameterType="com.dt.springbootdemo.entity.Employee">
REPLACE INTO t_employee(id, name, age, salary, department_id,update_time)
VALUES (#{id},#{name},#{age},#{salary},#{departmentId},now())
</insert>


總結(jié):實際開發(fā)中,用得最多的就是第二種方式,進(jìn)行的批量加。
<!--插入員工數(shù)據(jù)-->
<insert id="saveEmp" parameterType="java.util.List">
INSERT INTO t_employee(id, name, age, salary, department_id,update_time)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(#{item.id},#{item.name},#{item.age},#{item.salary},#{item.departmentId},now())
</foreach>
ON DUPLICATE KEY UPDATE id = id
</insert>
控制器:
@PostMapping("save")
@ResponseBody
public CommonResult<Employee> save(@RequestBody List<Employee> employeeList){
return employeeService.saveEmp(employeeList);
}

如果存在相同的ID,則不會重復(fù)添加。
總結(jié)
實際工作中,使用最多的是方法二,根據(jù)不同的場景選擇不同的方式使用。
到此這篇關(guān)于MySql批量插入時如何不重復(fù)插入數(shù)據(jù)的文章就介紹到這了,更多相關(guān)MySql不重復(fù)插入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL循環(huán)語句之while循環(huán)測試
MySQL有循環(huán)語句操作,while 循環(huán)、loop循環(huán)和repeat循環(huán),目前我只測試了 while 循環(huán),下面與大家分享下2014-07-07
淺談mysql數(shù)據(jù)庫中的換行符與textarea中的換行符
下面小編就為大家?guī)硪黄獪\談mysql數(shù)據(jù)庫中的換行符與textarea中的換行符。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
MySQL下200GB大表備份的操作(利用傳輸表空間解決停服發(fā)版表備份問題)
這篇文章主要介紹了MySQL下200GB大表備份的操作(利用傳輸表空間解決停服發(fā)版表備份問題),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2025-04-04
通過sql語句將blob里的char取出來轉(zhuǎn)成數(shù)字保存在其它字段
現(xiàn)在需要將blob里地17、18、19三個字段里的數(shù)據(jù)作為數(shù)字保存在blob外新增的三個字段Gem1 Gem2 Gem3上。2011-09-09
mysql5.7.18安裝時mysql服務(wù)啟動失敗的解決方法
這篇文章主要為大家詳細(xì)介紹了mysql5.7.18安裝時mysql服務(wù)啟動失敗的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03
MySQL Delete 刪數(shù)據(jù)后磁盤空間未釋放的原因
這篇文章主要介紹了MySQL Delete 刪數(shù)據(jù)后磁盤空間未釋放的原因,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下2021-05-05

