Mysql批量插入數(shù)據(jù)時該如何解決重復問題詳解
前言
當數(shù)據(jù)庫中存量數(shù)據(jù)較多時,或者是在批量插入操作時,很容易出現(xiàn)插入重復數(shù)據(jù)的問題。
一、三種方法
在 mysql 中,當存在主鍵沖突或唯一鍵沖突的情況下,根據(jù)插入策略不同,一般有以下三種避免方法:
insert ignore into:若沒有則插入,若存在則忽略
replace into:若沒有則正常插入,若存在則先刪除后插入
insert into ... on duplicate key update:若沒有則正常插入,若存在則更新
注意,使用以上方法的前提是表中有一個 PRIMARY KEY 或 UNIQUE 約束/索引,否則,使用以上三個語句沒有特殊意義,與使用單純的 INSERT INTO 效果相同。
測試表結構:
測試表數(shù)據(jù):
二、細節(jié)
2.1、insert ignore into
insert ignore 會根據(jù)主鍵或者唯一鍵判斷,忽略數(shù)據(jù)庫中已經(jīng)存在的數(shù)據(jù),若數(shù)據(jù)庫沒有該條數(shù)據(jù),就插入為新的數(shù)據(jù),跟普通的 insert into 一樣。若數(shù)據(jù)庫有該條數(shù)據(jù),就忽略這條插入語句,不執(zhí)行插入操作。
insert ignore into student(age) values (12),(13);
age=12的數(shù)據(jù)已存在,因此未插入(根據(jù)創(chuàng)建時間可得),age=13的數(shù)據(jù)不存在,因此成功插入
2.2 、insert into ... on duplicate key update
在 insert into 語句末尾指定 on duplicate key update,會根據(jù)主鍵或者唯一鍵判斷:若數(shù)據(jù)庫有該條數(shù)據(jù),則直接更新原數(shù)據(jù),相當于 update,若數(shù)據(jù)庫沒有該條數(shù)據(jù),則插入為新的數(shù)據(jù),跟普通的 insert into 一樣。
insert into student(age) values (12),(13) ON DUPLICATE KEY UPDATE student.created_at = '2022-01-01 00:00:00';
age=12的記錄已存在,因此created_at字段被更新。age=13的記錄不存在,因此成功插入
2.3、replace into
replace into student(age) values (12),(13);
age=12的記錄已存在,因此被刪除重新插入(由createdAt值可知)。age=13的記錄不存在,因此成功插入
replace into 會根據(jù)主鍵或者唯一鍵判斷:
- 若表中已存在該數(shù)據(jù),則先刪除此行數(shù)據(jù),然后插入新的數(shù)據(jù),相當于 delete + insert
- 可能會丟失數(shù)據(jù)、主從服務器的 AUTO_INCREMENT 不一致。
- 若表中不存在該數(shù)據(jù),則直接插入新數(shù)據(jù),跟普通的 insert into 一樣
三、總結
1)在主鍵沖突情況下,三種方法都可以使用
2)在唯一鍵沖突情況下,且有自增主鍵時:三種方法都會出現(xiàn) AUTO_INCREMENT 不連續(xù)問題,且這種不連續(xù)不會同步更新到 slave 的 AUTO_INCREMENT。當 master 被 kill,且 slave 升級為 master 時,就會出現(xiàn)主鍵沖突問題。(因為事務原因,即使沒有插入成功,也會占用一個自增id。row模式binlog下,主從的數(shù)據(jù)同步是一致的,主鍵也一致。有沒有影響取決于主從同步模式)
- statement格式:binlog記錄的是實際執(zhí)行的sql語句
- row格式:binlog記錄的是變化前后的數(shù)據(jù)(涉及所有列),形如update table_a set col1=value1, col2=value2 ... where col1=condition1 and col2=condition2 ...
- mixed格式:默認選擇statement格式,只在需要時改用row格式
3)replace into 方法可能會導致部分數(shù)據(jù)丟失。
到此這篇關于Mysql批量插入數(shù)據(jù)時該如何解決重復問題的文章就介紹到這了,更多相關Mysql批量插入數(shù)據(jù)重復問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
高效數(shù)據(jù)流轉:Mycat分庫分表與GreatSQL實時同步
聚焦數(shù)據(jù)庫擴容與實時數(shù)據(jù)同步,探索MyCat分庫分表與GreatSQL的強大結合!想在大規(guī)模數(shù)據(jù)處理中游刃有余?本指南將帶你輕松掌握MyCat的分布式解決方案和GreatSQL的實時同步機制,讓高效、穩(wěn)定的數(shù)據(jù)庫管理觸手可及,一起揭開高并發(fā)環(huán)境下數(shù)據(jù)庫優(yōu)化的神秘面紗吧!2024-01-01利用MySQL加密函數(shù)保護Web網(wǎng)站敏感數(shù)據(jù)的方法分享
如果您正在運行使用MySQL的Web應用程序,那么它把密碼或者其他敏感信息保存在應用程序里的機會就很大2012-03-03強制修改mysql的root密碼的六種方法分享(mysql忘記密碼)
下面我們提供了6種不同的修改mysql root用戶的密碼,與增加mysql用戶的方法2011-11-11MySQL AUTO_INCREMENT 主鍵自增長的實現(xiàn)
本文主要介紹了MySQL AUTO_INCREMENT 主鍵自增長的實現(xiàn),每增加一條記錄,主鍵會自動以相同的步長進行增長,具有一定的參考價值,感興趣的可以了解一下2023-11-11