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

推薦する

Mailtoを使えばHTMLでメールを送るのは簡単

最近、顧客のフッターメールボックスにクリックして送信するメール機能を追加しました。Baidu で検索...

MySQL のスローログオンラインの問題と最適化ソリューション

MySQL スロー ログは、MySQL DBA やその他の開発および運用担当者が細心の注意を払う必要...

MySQL ツリー構造データベース テーブル設計

目次序文1. 基本データ2. 継承駆動設計3. 左右の値のエンコーディングに基づく設計4. ツリー構...

Vueでブラウザタイトルを動的に設定する方法の詳細な説明

目次ナンセンス文章最初ルーター/index.js 2番目1. プラグインをインストールする2.mai...

MySQLの手順を完全に削除する

目次1. まずMySQLサーバーを停止する2. MySQLサーバーをアンインストールする3. MyS...

Dockerコンテナのインポ​​ートとエクスポートに関するチュートリアル

背景Docker の人気は、コンテナの共有と移植が容易であることと密接に関係しています。ユーザーは、...

CSS でショートカット プロパティを記述する際は、トラブルの順序に注意してください (落とし穴を避けるため)

ショートハンドプロパティは、複数のプロパティに同時に値を割り当てるために使用されます。たとえば、fo...

MySQL の問題を解決する: MSVCR120.dll が見つからないため、コードの実行を続行できません

1. 問題MySQL の初期化時に発生する問題は、次のとおりです。 1. 「MSVCR120.dll...

Linuxカーネルスケジューラソースコード初期化の分析

目次1. はじめに2. スケジューラの基本概念2.1. 実行キュー (rq) 2.2 スケジューリン...

Linuxの読み取りコマンドの使用

1. コマンドの紹介read コマンドは、シェルの組み込みコマンドで、標準入力または -u オプショ...

HTML での一般的なリダイレクト接続の例コード

コードをコピーコードは次のとおりです。 window.location.href="zcb...

Docker コンテナ アプリケーションで避けるべき 10 の悪い習慣

コンテナが企業の IT インフラストラクチャに欠かせない要素となっていることは間違いありません。コン...

SASSで変数のデフォルト値を使用する方法

SASS で定義された変数では、後で設定された値によって古い値が上書きされます。 $色: 赤; $色...

HTML+CSS+JavaScript でガールフレンド版のスクラッチ カードを作成します (一度見ればすぐに覚えられます)

誰もがスクラッチ チケットで遊んだことがあると思います。子供の頃、ポケットにお金が入るとすぐに友達に...

Vue で className として空の文字列を使用することはなぜ推奨されないのですか?

目次空の文字列 '' と null を比較するケース1: 空の文字列を使用する &#...