MySql バッチに挿入するときにデータの重複を避ける方法

MySql バッチに挿入するときにデータの重複を避ける方法

序文

Mysql は重複しないデータを挿入します。大量のデータを挿入する必要がある場合、挿入が重複しているかどうかを判断してから挿入する必要があります。では、効率を向上させるにはどうすればよいでしょうか。問題を解決する方法は数多くあり、シナリオによって解決策は異なります。データ量が少ない場合は、どのような解決策でも問題ありませんが、データ量が多い場合は、単純な問題ではありません。

1. ignore を挿入

データベースにすでに存在するデータは無視されます。データベースにデータがない場合、新しいデータが挿入されます。データがある場合、現在挿入されているデータはスキップされます。このようにして、データベース内の既存のデータを保持し、ギャップにデータを挿入するという目的を達成することができます。

コントローラーメソッド:

/**
 *従業員データを挿入*/
@PostMapping("保存")
@レスポンス本文
パブリック CommonResult<Employee> 保存(@RequestBody Employee 従業員) {
    employeeService.saveEmp(従業員) を返します。
}
挿入する
<!--従業員データを挿入-->
<挿入 id="saveEmp" パラメータタイプ="com.dt.springbootdemo.entity.Employee">
    t_employee(ID、名前、年齢、給与、部門ID)に挿入します。
    値 (#{id},#{name},#{age},#{salary},#{departmentId})
</挿入> 

ここに画像の説明を挿入

主キー ID 1 を持つ新しい従業員レコードを追加します。

リクエストを再度送信すると、主キーが一意であり、ID=1 のレコードがすでに存在するため、SQL ステートメント実行エラーが報告されます。

ここに画像の説明を挿入

無視を追加し、ID=1 の別の従業員レコードを追加します。

挿入無視

ここに画像の説明を挿入

エラーは発生しませんでしたが、追加は成功せず、重複データの追加は無視されました。

2. 重複キーの更新時

主キーまたは一意キーが重複している場合は、更新ステートメントが実行されます。

 重複キー更新時 id = id

ID=1 の従業員レコードを挿入し、他のフィールド (年齢=25) を変更します。

ここに画像の説明を挿入

データベースレコードを表示します:

ここに画像の説明を挿入

変更はなく、データは 1 つだけであり、成功のプロンプトが返されていることがわかります。

この方法には前提条件があり、挿入する制約は主キーまたは一意制約である必要があります (業務において、唯一の判断基準として使用する必要のあるフィールドは、一意制約、つまり一意キーとして設定する必要があります)。

拡張: この方法には、他のビジネス シナリオのニーズもあります ->>>他のフィールドを定期的に更新します。

従業員テーブルに時間フィールドを追加します。

プライベート日付更新時間; 

ここに画像の説明を挿入

次に、updateTime フィールドに従ってデータを挿入します。

<挿入 id="saveEmp" パラメータタイプ="com.dt.springbootdemo.entity.Employee">
    t_employee(ID、名前、年齢、給与、部門ID、更新時刻)に挿入します。
    値 (#{id},#{name},#{age},#{salary},#{departmentId},now())
    重複キー更新の場合 update_time = now()
</挿入>

ここに画像の説明を挿入

ここに画像の説明を挿入

ここに画像の説明を挿入

挿入時に他のフィールド (年齢など) を更新する必要がある場合はどうすればよいですか?

ここに画像の説明を挿入
ここに画像の説明を挿入

ここに画像の説明を挿入

3. を置き換える

同じプライマリまたは一意のレコードがある場合は、まずそれらを削除します。新しいレコードを再度挿入します。

置換する
 <!--従業員データを挿入-->
<挿入 id="saveEmp" パラメータタイプ="com.dt.springbootdemo.entity.Employee">
    t_employee(id, name, age, salary, department_id,update_time) に置き換えます。
    値 (#{id},#{name},#{age},#{salary},#{departmentId},now())
</挿入>

ここに画像の説明を挿入

ここに画像の説明を挿入

要約: 実際の開発では、2 番目の方法であるバッチ追加が最も一般的に使用されます。

<!--従業員データを挿入-->
<挿入 id="saveEmp" パラメータタイプ="java.util.List">
    t_employee(ID、名前、年齢、給与、部門ID、更新時刻)に挿入します。
    価値観
    <foreach collection="リスト" item="項目" index="インデックス" セパレーター=",">
        (#{item.id},#{item.name},#{item.age},#{item.salary},#{item.departmentId},now())
    </foreach>
    重複キー更新時 id = id
</挿入>

コントローラ:

@PostMapping("保存")
@レスポンス本文
パブリック CommonResult<従業員> 保存(@RequestBody リスト<従業員> 従業員リスト) {
    employeeService.saveEmp(employeeList) を返します。
}

ここに画像の説明を挿入

同じIDが存在する場合、重複して追加されることはありません。

要約する

実際の業務では、方法 2 が最も一般的に使用される方法であり、さまざまなシナリオに応じてさまざまな方法が使用されます。

これで、MySql バッチ挿入時に重複なしでデータを挿入する方法に関するこの記事は終了です。MySql の重複なし挿入に関する関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLは重複しないデータ挿入を実装するためにUNIQUEを使用する

<<:  HTML タグのカスタム属性に関する質問

>>:  CSS3プロパティline-clampはテキスト行の使用を制御します

推薦する

MySQL が大規模トランザクションを避けるべき理由とその解決方法

何が大問題ですか?長時間実行され、長時間コミットされないトランザクションは、大規模トランザクションと...

シンプルなドラッグ効果を実現するJavaScript

この記事では、簡単なドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

MySQL はどのようにしてデータベースの削除と暴走を効果的に防ぐことができますか?

目次セーフモード設定テスト1. where句なしで更新および削除する2. 非インデックスキーの削除3...

MySQL の大文字と小文字の区別に関する注意

目次MySQLの大文字と小文字の区別はパラメータによって制御されますMySQLの大文字と小文字の区別...

Node.js パッケージ マネージャー npm の具体的な使用方法

目次目的npm init および package.json ファイルモジュールのインストールと管理モ...

HTML マウス CSS コントロール

一般的に、マウスは上向きの斜め矢印として表示され、テキストの上に移動すると垂直線になり、ハイパーリン...

Vueは虫眼鏡付きの検索ボックスを実装します

この記事では、Vueを使用して虫眼鏡付きの検索ボックスを実装する方法を紹介します。具体的な内容は次の...

JavaScript における Arguments オブジェクトの使用に関する詳細な説明

目次序文議論の基本概念議論の役割実パラメータと仮パラメータの数を取得する実際のパラメータ値を変更する...

テキストスクロール後の自動停止効果の例

効果は非常にシンプルで、次のコードを自分のページにコピーして実行するだけです。コードをコピーコードは...

HTML ページジャンプのパラメータ渡しの問題

効果は以下のとおりです。ページジャンプボタンをクリックした後 対応する値はページ b で取得できます...

レスポンシブレイアウトについて知っておくべきこと

1. はじめにレスポンシブ Web デザインにより、Web サイトは複数のデバイスと複数の画面に同時...

Linux Centos でスクリプトを使用して Docker をインストールする方法

Dockerの主な機能は何ですか?現在、Docker には少なくとも次のアプリケーション シナリオが...

CentOS7 64 ビットでの MySQL 5.7 のインストールと設定のチュートリアル

インストール環境: CentOS7 64ビットMINI版、MySQL5.7をインストール1. YUM...

Linuxの一般的なコマンドでLinuxのmoreコマンドを使用する方法

more は、最もよく使用されるツールの 1 つです。最も一般的な使用方法は、出力コンテンツを表示し...

CSS3 クリックボタン円形進行ティック効果実装コード

目次8. CSS3 クリックボタンの円形進捗チェック効果8.1 画像プレビュー8.2 index.h...