MySql批量大數據插入時,如何不插入重復的數據?
關注我們,設為星標,每天7:30不見不散,架構路上與您共享 回復"架構師"獲取資源
◆ 前言
Mysql插入不重復的數據,當大數據量的數據需要插入值時,要判斷插入是否重復,然后再插入,那么如何提高效率?解決的辦法有很多種,不同的場景解決方案也不一樣,數據量很小的情況下,怎么搞都行,但是數據量很大的時候,這就不是一個簡單的問題了。
◆ insert ignore into
會忽略數據庫中已經存在 的數據,如果數據庫沒有數據,就插入新的數據,如果有數據的話就跳過當前插入的這條數據。這樣就可以保留數據庫中已經存在數據,達到在間隙中插入數據的目的。
控制器方法:
/*** 插入員工數據*/public CommonResult<Employee> save( Employee employee){return employeeService.saveEmp(employee);}
INSERT INTO 插入數據<!--插入員工數據--><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的員工記錄。
當我再發(fā)送一次請求的時候,會報SQL語句執(zhí)行錯誤,因為主鍵唯一,并且ID=1的記錄已經存在了。

加上ignore,再次添加一條ID=1的員工記錄
INSERT IGNORE INTO
并沒有報錯,但是也沒有添加成功,忽略了重復數據的添加。
◆ on duplicate key update
當主鍵或者唯一鍵重復時,則執(zhí)行update語句。
ON DUPLICATE KEY UPDATE id = id我們任然插入ID=1的員工記錄,并且修改一下其他字段(age=25):

查看數據庫記錄:

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


總結:實際開發(fā)中,用得最多的就是第二種方式,進行的批量加。
<!--插入員工數據--><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>
控制器:
public CommonResult<Employee> save( List<Employee> employeeList){return employeeService.saveEmp(employeeList);}

如果存在相同的ID,則不會重復添加。
◆ 總結
實際工作中,使用最多的是方法二,根據不同的場景選擇不同的方式使用。
文章來源:blog.csdn.net/qq_41107231/article/details/117911314

到此文章就結束了。如果今天的文章對你在進階架構師的路上有新的啟發(fā)和進步,歡迎轉發(fā)給更多人。歡迎加入架構師社區(qū)技術交流群,眾多大咖帶你進階架構師,在后臺回復“加群”即可入群。
這些年小編給你分享過的干貨
2.ERP系統(tǒng),自帶進銷存+財務+生產功能,拿來即用
3.帶工作流的SpringBoot后臺管理項目快速開發(fā)解決方案
4.最好的OA系統(tǒng),拿來即用,非常方便
5.SpringBoot+Vue完整的外賣系統(tǒng),手機端和后臺管理,附源碼!

轉發(fā)在看就是最大的支持??
