MySql批量插入時如何不重復插入數據
前言
Mysql插入不重復的數據,當大數據量的數據需要插入值時,要判斷插入是否重復,然後再插入,那麼如何提高效率?解決的辦法有很多種,不同的場景解決方案也不一樣,數據量很小的情況下,怎麼搞都行,但是數據量很大的時候,這就不是一個簡單的問題瞭。
一、insert ignore into
會忽略數據庫中已經存在 的數據,如果數據庫沒有數據,就插入新的數據,如果有數據的話就跳過當前插入的這條數據。這樣就可以保留數據庫中已經存在數據,達到在間隙中插入數據的目的。
控制器方法:
/** * 插入員工數據 */ @PostMapping("save") @ResponseBody public CommonResult<Employee> save(@RequestBody 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的員工記錄。
當我再發送一次請求的時候,會報SQL語句執行錯誤,因為主鍵唯一,並且ID=1的記錄已經存在瞭。
加上ignore,再次添加一條ID=1的員工記錄
INSERT IGNORE INTO
並沒有報錯,但是也沒有添加成功,忽略瞭重復數據的添加。
二、on duplicate key update
當主鍵或者唯一鍵重復時,則執行update語句。
ON DUPLICATE KEY UPDATE id = id
我們任然插入ID=1的員工記錄,並且修改一下其他字段(age=25):
查看數據庫記錄:
可以看到並沒有改變,數據也隻有一條,並且返回瞭成功的提示。
這種方法有個前提條件,就是,需要插入的約束,需要是主鍵或者唯一約束(在你的業務中那個要作為唯一的判斷就將那個字段設置為唯一約束也就是unique key)。
擴展:這種方式還有其他業務場景的需求->>>定時更新其他字段。
我們在員工表中,再加入一個時間字段:
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
<!--插入員工數據--> <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>
總結:實際開發中,用得最多的就是第二種方式,進行的批量加。
<!--插入員工數據--> <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,則不會重復添加。
總結
實際工作中,使用最多的是方法二,根據不同的場景選擇不同的方式使用。
到此這篇關於MySql批量插入時如何不重復插入數據的文章就介紹到這瞭,更多相關MySql不重復插入內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SQL實現LeetCode(184.系裡最高薪水)
- SQL實現LeetCode(185.系裡前三高薪水)
- MySQL中增刪改查操作與常見陷阱詳解
- mysql ON DUPLICATE KEY UPDATE重復插入時更新方式
- mysql中insert ignore、insert和replace的區別及說明