欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql批量插入數(shù)據(jù)時(shí)該如何解決重復(fù)問(wèn)題詳解

 更新時(shí)間:2022年11月10日 10:09:28   作者:頭禿的程序員小王  
之前寫(xiě)的代碼批量插入遇到了問(wèn)題,原因是有重復(fù)的數(shù)據(jù)(主鍵或唯一索引沖突),所以插入失敗,下面這篇文章主要給大家介紹了關(guān)于Mysql批量插入數(shù)據(jù)時(shí)該如何解決重復(fù)問(wèn)題的相關(guā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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論