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 の実装原則の詳細な説明

推薦する

JavaScriptとTypeScriptの関係

目次1. JavaScript とは何ですか? 2. JavaScript は何に使用されますか? ...

IE で UTF8 エンコードされたページで行が理由もなく空白のままになり、UTF8 ページが表示されない問題の解決方法

理由は、すべてのファイルが utf8 でエンコードされているためです。ファイルがインクルードされると...

Flutterを使用して移動可能なスタックウィジェット機能を作成する

この投稿では、キャンバスとドラッグ可能なノード インターフェースを使用するデスクトップおよび Web...

jQueryは何に使われるのですか?jQueryは実際にはjsフレームワークです

jQuery 入門jQuery ライブラリは、簡単なマークアップ行を使用して Web ページに追加で...

さまざまな Tomcat ログと catalina.out ファイルのセグメンテーションの関係についての簡単な分析

Tomcatログの関係一枚の写真は千の言葉に値する! localhost.{yyyy-MM-dd}....

MySQL で distinct メソッドを使用する詳細な例

明確な意味: distinctive は、一意のレコードの数を照会するために使用されます。つまり、d...

2018 年にリリースされる Apache Spark 2.4 の新機能は何ですか?

この記事は、2018 年 9 月 19 日に Adob​​e Systems Inc で開催された ...

Vue プロジェクトのパッケージ化、マージ、圧縮により、Web ページの応答速度を最適化します。

目次序文1. リクエスト内容が大きすぎる解決: CDN の紹介リクエストリソースを圧縮する1. HT...

Vueは複数の画像の追加、表示、削除を実装します

この記事では、Vueで複数の画像を追加、表示、削除するための具体的なコードを参考までに紹介します。具...

ウェブページで任意のフォントを使用する実践的な操作とデモ

以前、「Web ページにシステムに組み込まれていないフォントを埋め込む」という研究をしたことがありま...

Nginx は https ウェブサイト構成コード例を実装します

https ベースポート 443。これはキーと呼ばれるものに使用されます。これらのことを理解せずにで...

nginx+lua を使用した単一マシンでの何万もの同時接続の実装

nginx は弊社で最もよく使用されるサーバーで、コンテンツ配信やリバース プロキシによく使用されま...

div を下から上にスライドさせる CSS3 の例

1. まず、CSS3 のターゲット セレクターを使用し、a タグを使用して id セレクターを指定し...

MySQLクエリキャッシュに関するヒント

目次序文QueryCache の概要クエリキャッシュ構成QueryCache の使用queryCac...

overflow:autoの使い方の詳しい説明

本文に入る前に、オーバーフローとフレックスレイアウトの使い方をいくつか紹介します。 overflow...