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

推薦する

Vueプロジェクトを大画面に適応させる方法の例

レムの簡単な分析まず、remはCSS単位です。pxの固定ピクセル単位と比較すると、remはより柔軟性...

初心者向けWebサイト構築ガイド⑥:FlashFXPの詳しい使い方

今日は、サイトの設定やウェブサイトのアップロードなど、FlashFXP の最も基本的な機能を紹介しま...

初心者向けに Docker に Jenkins をインストールする方法を詳しく説明したチュートリアル

Jenkins はオープンソース ソフトウェア プロジェクトです。Java をベースに開発された継続...

MySQLクエリのソートとページング関連

概要通常、データベース内のデータを直接表示することは望ましくないため、最後の 2 つのセクションでは...

Dockerコンテナのログ分析

コンテナログを表示するまず、 docker run -it --rm -d -p 80:80 ngi...

MySQL 5.7.17 でパスワードを忘れた場合の対処方法

1. my.iniファイルにskip-grant-tablesを追加し、MySQLサーバーを再起動し...

Vue Element フロントエンドアプリケーション開発のための従来の JS 処理機能

目次1. 従来のコレクションに対するフィルター、マップ、および削減処理方法2. 再帰処理3. for...

Vueはキー表示のショートカットキー効果を取得する入力コンポーネントを実装します

ページ上でショートカットキーをカスタマイズする要件に遭遇し、ショートカットキーを設定して表示する場所...

ubuntu18.04 での qt5.12.8 のインストールと環境設定に関する詳細なチュートリアル

環境システム: Ubuntu 18.04ソフトウェア: qt5.12.8 1. インストールパッケー...

Sublime / vscode による HTML コード生成の迅速な実装

目次基本的なHTML構造div とクラス名のショートカット キーを生成するクラス名を持つdiv ID...

div の幅が width:100% に設定されていて、パディングまたはマージンが親要素を超えてしまう問題の解決方法

序文この記事では、div の幅を 100% に設定し、親要素を超えてパディングまたはマージンを設定す...

CSS 水平プログレスバーと垂直プログレスバーの実装コード

時々、素敵なスクロールバー効果を見るのは楽しいものです。ここでは、CSSを使用してそれを実現する方法...

LAMP ソースコードを使用したエンタープライズレベルのインストールチュートリアル

目次LAMPアーキテクチャ1.ランプの紹介2. WebサービスワークフローWebサーバーのリソースは...

CSS3 での 2D および 3D 変換の実装

CSS3 は、要素の 2D 平面変換と視覚的な 3D 空間変換を実装します。2D 変換はより頻繁に使...

JavaScriptは4桁のランダム検証コードの生成を実装します

この記事の例では、JavaScriptで4桁のランダムな検証コードを生成する具体的なコードを参考まで...