MySQL バッチ挿入とユニークインデックスの問題に対する解決策

MySQL バッチ挿入とユニークインデックスの問題に対する解決策

MySQL バッチ挿入の問題

プロジェクトを開発しているときに、古いシステムの基本データを事前にインポートする必要があったため、インポート中にバッチインポート操作を実行しました。ただし、MySQL で許容される SQL ステートメントのサイズが制限されているため、一度に 500 しかバッチ処理できないにもかかわらず、挿入できません。このとき、コードは次のエラーを報告します。

ネストされた例外は、com.mysql.jdbc.PacketTooBigException: クエリのパケットが大きすぎます (5677854 > 1048576)。

サーバー上で「max_allowed_pa​​cket」変数を設定することにより、この値を変更できます。

エラー レポートによると、SQL ステートメント データ パケットが大きすぎることがすぐにわかります。この問題を解決するには、MySQL サーバー パラメータ max_allowed_pa​​cket を設定できます。

解決

1. [mysqld] の下に max_allowed_pa​​cket パラメータを追加し、できるだけ大きく設定します。

#my.cnf ファイルを探す#my.cnf はどこにあるか
#vim マイ.cnf
----------------------------
[mysqld]
最大接続数 = 3000
最大許容パケット=1024M

#保存してmysqlサービスを再起動して有効にします#service mysqld restart

2. max_allowed_pa​​cketを一時的に設定し、ステートメントで設定します。

myslq>グローバルmax_allowed_pa​​cketを1024*1024*1024に設定します

このように再起動すると、max_allowed_pa​​cketは無効になります

デフォルトでは、MySQL パラメータ max_allowed_pa​​cket の値は 1M です。

MySQLインデックスは大文字と小文字を区別しません

MySQL データベースでインデックスを作成する場合、デフォルトでは大文字と小文字は区別されません。たとえば、次のステートメント:

テーブル `location` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `rc` varchar(2) デフォルト NULL コメント 'R/C',
 `location_code` varchar(4) デフォルト NULL コメント '場所コード',
 `location_name` varchar(30) DEFAULT NULL COMMENT '場所名',
 `zip_code` varchar(6) デフォルト NULL コメント '郵便番号',
 `address` varchar(50) デフォルト NULL コメント 'アドレス',
 `link_man` varchar(15) DEFAULT NULL COMMENT '連絡先',
 `link_phone` varchar(30) DEFAULT NULL COMMENT '連絡先電話番号',
 `fax` varchar(30) デフォルト NULL コメント 'Fax',
 `can_accept_car_time` varchar(40) DEFAULT NULL COMMENT '利用可能な車のピックアップ時間',
 `type` varchar(1) デフォルト NULL コメント 'カテゴリ',
 `maintenance_type` varchar(1) DEFAULT NULL COMMENT 'メンテナンスタイプ',
 `brand` varchar(4) デフォルト NULL コメント 'ブランド',
 `reservation` varchar(40) デフォルト NULL コメント 'Reservation',
 `enable` int(1) デフォルト '1',
 `msg_code` varchar(64) NOT NULL COMMENT 'メッセージコード',
 `receive_on` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '受信日',
 `create_on` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日',
 `modified_on` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '変更日',
 主キー (`id`)、
 ユニークキー `unique_msg_code` (`msg_code`) BTREE 使用、
 ユニークキー `unique_location_code` (`location_code`) BTREE の使用
) ENGINE=InnoDB AUTO_INCREMENT=16325 DEFAULT CHARSET=utf8 COMMENT='アドレステーブル';

しかし、アドレス コード H12C と h12C をそれぞれ挿入すると、エラーが報告され、例外がスローされました: キー 'normal_localtion_code' のエントリ 'H12C' が重複しています。これは大文字と小文字が区別されないことを意味するため、この問題を解決する必要があります。

回避策

1. インデックスで大文字と小文字が区別されるように、フィールドをバイナリに設定します。

テーブル `location` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `rc` char(2) デフォルト NULL コメント 'R/C',
 `location_code` varchar(4) 文字セット utf8 照合 utf8_bin デフォルト NULL コメント '場所コード',
 `location_name` varchar(26) DEFAULT NULL COMMENT '場所名',
 `zip_code` varchar(6) デフォルト NULL コメント '郵便番号',
 `address` varchar(50) デフォルト NULL コメント 'アドレス',
 `link_man` varchar(16) DEFAULT NULL COMMENT '連絡先',
 `link_phone` varchar(30) DEFAULT NULL COMMENT '連絡先電話番号',
 `fax` varchar(30) デフォルト NULL コメント 'Fax',
 `can_accept_car_time` varchar(40) DEFAULT NULL COMMENT '利用可能な車のピックアップ時間',
 `type` varchar(1) デフォルト NULL コメント 'カテゴリ',
 `maintenance_type` varchar(1) DEFAULT NULL COMMENT 'メンテナンスタイプ',
 `brand` varchar(4) デフォルト NULL コメント 'ブランド',
 `reservation` varchar(40) デフォルト NULL コメント 'Reservation',
 `enable` int(1) デフォルト '1',
 `msg_code` varchar(64) NOT NULL COMMENT 'メッセージコード',
 `receive_on` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '受信日',
 `create_on` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成日',
 `modified_on` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '変更日',
 主キー (`id`)、
 ユニークキー `unique_msg_code` (`msg_code`) BTREE 使用、
 ユニークキー `unique_location_code` (`location_code`) BTREE の使用
) ENGINE=InnoDB AUTO_INCREMENT=4092 DEFAULT CHARSET=utf8 COMMENT='ロケーションテーブル';

// 元のテーブル辞書の属性を変更します:

ALTER TABLE `location`
変更列 `location_code` `location_code` VARCHAR(4) 文字セット 'utf8' BINARY NOT NULL DEFAULT '';

上記の方法で問題は解決します。

クエリでは大文字と小文字は区別されません

回避策


1. クエリステートメントにバイナリを追加する

2. インデックス ソリューションと一致して、フィールド属性をバイナリに設定します。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQL に大量のデータを挿入する 4 つの方法の例
  • MYSQL バッチ挿入データ実装コード
  • MySQL でバッチ挿入を実装してパフォーマンスを最適化するチュートリアル
  • ユニークインデックスを使用したMySQLバッチ挿入を回避する方法
  • MySQL バッチデータ挿入スクリプト
  • MySQL バッチ SQL 挿入パフォーマンス最適化の詳細な説明
  • MySQL に 1,000 万件のレコードを素早く挿入する方法
  • MySQL の挿入およびバッチ ステートメントのいくつかの例の詳細な説明

<<:  URLに基​​づいてリクエストを転送するnginxの実装の実践経験

>>:  JavaScript における call、apply、bind の実装原則の詳細な説明

推薦する

HTMLのセマンティクスといくつかの簡単な最適化についての簡単な説明

1. セマンティゼーションとは何ですか? Bing辞書の説明セマンティクス化とは、適切な HTML ...

素晴らしいCSS属性MASKの詳しい説明

この記事では、CSS の非常に興味深い属性マスクを紹介します。名前が示すように、マスクはマスクと翻訳...

Expressプロジェクトファイルディレクトリの説明と詳細な機能の説明

app.js: スタートアップファイル、またはエントリファイルpackage.json: プロジェク...

MySQLのインデックスシステムがB+ツリーを使用する理由の分析

目次1. インデックスとは何ですか? 2. インデックスはなぜ必要なのでしょうか? 3. インデック...

Dockerを使用してコンテナリソースを制限する方法

覗き見の問題サーバーでは、IIS サービスが複数のサイトを展開していると仮定すると、サイトの 1 つ...

優れた UI (ユーザー インターフェース) デザイナーになるための 20 の道標

はじめに: インターフェイス デザイナーの Joshua Porter が自身のブログでこの記事を公...

Vue の計算プロパティとリスナーの使用の概要

1. 計算プロパティとリスナー1.1 計算プロパティ <!DOCTYPE html> &...

バッチファイルを処理するLinuxの1行コマンドの詳細な説明

序文最良の方法は、あなたが思いつく最も速い方法ではないかもしれません。職場で一時的に使用するスクリプ...

HTMLバージョン宣言DOCTYPEタグ

通常のウェブサイトのソースコードを開くと、ソースコードは<!DOCTYPE htmlで始まる必...

Webフロントエンドインターフェースの設計に必須のスキル

[必須] ユーザーインターフェースPhotoShop/花火デザインアーティストと協力して、スケッチを...

MySQL 8.0.21.0 コミュニティ エディションのインストール チュートリアル (詳細な図解)

1. MySQLをダウンロードするMySQL 公式 Web サイトにログインし、MSI インストー...

Web デザインのヒント: ページ レイアウトの簡単なルール

繰り返し: サイト全体で特定のページ デザイン スタイルを繰り返します。繰り返し要素としては、特定の...

MySQL マルチインスタンス インストール ブート自動起動サービス設定プロセス

1.MySQLの複数インスタンスMySQL マルチインスタンスとは、1 台以上のマシン上で複数の M...

Linux で Apache を使用してファイル サーバーを構築する手順

1. ファイルサーバーについてプロジェクトでは、公開ソフトウェアやデータをプロジェクト チーム メン...

Vue ミックスインの詳しい説明

目次ローカルミックスイングローバル ミックスイン要約するローカルミックスイン <テンプレート&...