首頁 > 軟體

Mysql批次插入資料時該如何解決重複問題詳解

2022-11-11 14:02:07

前言

當資料庫中存量資料較多時,或者是在批次插入操作時,很容易出現插入重複資料的問題。

一、三種方法

在 mysql 中,當存在主鍵衝突或唯一鍵衝突的情況下,根據插入策略不同,一般有以下三種避免方法:

insert ignore into:若沒有則插入,若存在則忽略

replace into:若沒有則正常插入,若存在則先刪除後插入

insert into ... on duplicate key update:若沒有則正常插入,若存在則更新

注意,使用以上方法的前提是表中有一個 PRIMARY KEY 或 UNIQUE 約束/索引,否則,使用以上三個語句沒有特殊意義,與使用單純的 INSERT INTO 效果相同。

測試表結構:

測試表資料:

二、細節

2.1、insert ignore into

insert ignore 會根據主鍵或者唯一鍵判斷,忽略資料庫中已經存在的資料,若資料庫沒有該條資料,就插入為新的資料,跟普通的 insert into 一樣。若資料庫有該條資料,就忽略這條插入語句,不執行插入操作。

insert ignore into student(age) values (12),(13);

age=12的資料已存在,因此未插入(根據建立時間可得),age=13的資料不存在,因此成功插入

2.2 、insert into ... on duplicate key update

在 insert into 語句末尾指定 on duplicate key update,會根據主鍵或者唯一鍵判斷:若資料庫有該條資料,則直接更新原資料,相當於 update,若資料庫沒有該條資料,則插入為新的資料,跟普通的 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 會根據主鍵或者唯一鍵判斷:

  • 若表中已存在該資料,則先刪除此行資料,然後插入新的資料,相當於 delete + insert
  • 可能會丟失資料、主從伺服器的 AUTO_INCREMENT 不一致。
  • 若表中不存在該資料,則直接插入新資料,跟普通的 insert into 一樣

三、總結

1)在主鍵衝突情況下,三種方法都可以使用

2)在唯一鍵衝突情況下,且有自增主鍵時:三種方法都會出現 AUTO_INCREMENT 不連續問題,且這種不連續不會同步更新到 slave 的 AUTO_INCREMENT。當 master 被 kill,且 slave 升級為 master 時,就會出現主鍵衝突問題。(因為事務原因,即使沒有插入成功,也會佔用一個自增id。row模式binlog下,主從的資料同步是一致的,主鍵也一致。有沒有影響取決於主從同步模式)

  • statement格式:binlog記錄的是實際執行的sql語句
  • row格式:binlog記錄的是變化前後的資料(涉及所有列),形如update table_a set col1=value1, col2=value2 ... where col1=condition1 and col2=condition2 ...
  • mixed格式:預設選擇statement格式,只在需要時改用row格式

3)replace into 方法可能會導致部分資料丟失。

到此這篇關於Mysql批次插入資料時該如何解決重複問題的文章就介紹到這了,更多相關Mysql批次插入資料重複問題內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com