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