MySQL データベース データのロード 複数の用途

MySQL データベース データのロード 複数の用途

MySQL Load Dataの多様な用途

1. LOAD の基本的な背景

データベースの運用と保守のプロセスでは、テキスト データを処理してデータベースにインポートする必要が必然的に生じます。この記事では、例としてインポートとエクスポートの一般的なシナリオをいくつか紹介します。

2. 基本パラメータをロードする

この記事の以下の例では、サンプル データを csv 形式でエクスポートするために次のコマンドを使用します (区切り文字としてコンマ、区切り文字として二重引用符を使用)。

-- 基本パラメータをエクスポートします。* を選択して、出力ファイル '/data/mysql/3306/tmp/employees.txt' にエクスポートします。
文字セット utf8mb4
フィールドは ',' で終了します
'"' で囲まれている
'\n' で終了する行
従業員から。従業員の上限は 10 です。

-- 基本パラメータをインポートし、ファイル '/data/mysql/3306/tmp/employees.txt' にデータをロードします
テーブルdemo.empに置き換えます
文字セット utf8mb4
フィールドは ',' で終了します
'"' で囲まれている
'\n' で終了する行
...

3. サンプルデータとサンプルテーブル構造をロードする

以下はサンプルデータ、テーブル構造、および対応する関係情報です。

--エクスポートされたファイルデータの内容 [root@10-186-61-162 tmp]# cat employees.txt
「10001」、「1953-09-02」、「ゲオルギ」、「ファチェッロ」、「M」、「1986-06-26」
「10002」、「1964-06-02」、「ベザレル」、「ジンメル」、「F」、「1985-11-21」
"10003","1959-12-03","Parto","Bamford","M","1986-08-28"
「10004」、「1954-05-01」、「クリスチャン」、「コブリック」、「M」、「1986-12-01」
「10005」、「1955-01-21」、「京一」、「マリニアック」、「M」、「1989-09-12」
"10006","1953-04-20","アンネケ","プロイジグ","F","1989-06-02"
"10007","1957-05-23","ツヴェタン","ジエリンスキー","F","1989-02-10"
「10008」、「1958-02-19」、「サニヤ」、「カルーフィ」、「M」、「1994-09-15」
「10009」、「1952-04-19」、「スマント」、「ピース」、「F」、「1985-02-18」
「10010」、「1963-06-01」、「ドゥアンケオ」、「ピヴェトー」、「F」、「1989-08-24」

-- サンプル テーブル構造 SQL > desc demo.emp;
+-------------+---------------+------+-----+--------+-------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+-------------+---------------+------+-----+--------+-------+
| emp_no | int | NO | PRI | NULL | |
| 生年月日 | 日付 | NO | | NULL | |
| first_name | varchar(16) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| fullname | varchar(32) | YES | | NULL | | -- エクスポートされたデータ ファイルに存在しない、テーブル内の新しいフィールド | gender | enum('M','F') | NO | | NULL | |
| hire_date | 日付 | NO | | NULL | |
| modify_date | datetime | YES | | NULL | | -- エクスポートされたデータ ファイルに存在しない新しいフィールドがテーブルに追加されます| delete_flag | char(1) | YES | | NULL | | -- エクスポートされたデータ ファイルに存在しない新しいフィールドがテーブルに追加されます+-------------+---------------+------+------+--------+--------+

-- エクスポートされたデータとフィールド emp_no birth_date first_name last_name gender hire_date 間の対応関係
「10001」「1953-09-02」「ゲオルギ」「ファチェッロ」「M」「1986-06-26」
「10002」「1964-06-02」「ベザレル」「ジンメル」「F」「1985-11-21」
「10003」「1959-12-03」「パルト」「バンフォード」「M」「1986-08-28」
「10004」「1954-05-01」「クリスチャン」「コブリック」「M」「1986-12-01」
「10005」「1955-01-21」「京一」「マリニアック」「M」「1989-09-12」
「10006」「1953-04-20」「アンネケ」「プロイジグ」「F」「1989-06-02」
「10007」「1957-05-23」「ツヴェタン」「ジエリンスキー」「F」「1989-02-10」
「10008」「1958-02-19」「サニヤ」「カルーフィ」「M」「1994-09-15」
「10009」「1952-04-19」「スマント」「ピース」「F」「1985-02-18」
「10010」「1963-06-01」「ドゥアンケーオ」「ピヴェトー」「F」「1989-08-24」

4. LOADシナリオの例

シナリオ 1. LOAD ファイルのフィールド数がデータ テーブルの数より多い

テキストファイル内のデータの一部のみをデータテーブルにインポートする必要があります

-- 2 つのフィールドを持つテーブル構造を一時的に作成します。SQL > create table emp_tmp select emp_no,hire_date from emp;
SQL > desc emp_tmp;
+-----------+------+------+------+-------+-------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+-----------+------+------+------+-------+-------+
| emp_no | int | NO | | NULL | |
| hire_date | 日付 | NO | | NULL | |
+-----------+------+------+------+-------+-------+

-- データのインポート ステートメント load data infile '/data/mysql/3306/tmp/employees.txt'
テーブルdemo.emp_tmpに置き換えます
文字セット utf8mb4
フィールドは ',' で終了します
'"' で囲まれている
'\n' で終了する行
(@C1、@C2、@C3、@C4、@C5、@C6) -- この部分は、employees.txt ファイル内の 6 列のデータに対応します -- エクスポートされたデータで指定された 2 列のみがテーブル内のフィールドと一致します。マッピング関係で指定された順序は、インポート結果に影響しません。set hire_date=@C6、
    従業員番号=@C1; 

-- データのインポート結果例 SQL > select * from emp_tmp;
+--------+-------------+
|従業員番号 |雇用日 |
+--------+-------------+
| 10001 | 1986-06-26 |
| 10002 | 1985-11-21 |
| 10003 | 1986-08-28 |
| 10004 | 1986-12-01 |
| 10005 | 1989-09-12 |
| 10006 | 1989-06-02 |
| 10007 | 1989-02-10 |
| 10008 | 1994-09-15 |
| 10009 | 1985-02-18 |
| 10010 | 1989-08-24 |
+--------+-------------+
セット内の行数は 10 行 (0.0016 秒)

シナリオ 2. LOAD ファイルのフィールド数がデータ テーブルより少ない

テーブル フィールドには、テキスト ファイル内のすべてのデータだけでなく、追加のフィールドも含まれます。

-- データのインポート ステートメント load data infile '/data/mysql/3306/tmp/employees.txt'
テーブルdemo.empに置き換えます
文字セット utf8mb4
フィールドは ',' で終了します
'"' で囲まれている
'\n' で終了する行
(@C1、@C2、@C3、@C4、@C5、@C6) -- この部分は、employees.txt ファイル内の 6 列のデータに対応します -- ファイル内のフィールドをテーブル内のフィールドにマップし、テーブル内の余分なフィールドは処理しません。set emp_no=@C1、
   生年月日=@C2,
   ファーストネーム=@C3,
   姓=@C4,
   性別=@C5,
   雇用日=@C6;

シナリオ3. LOADはカスタムフィールドデータを生成する

シナリオ 2 の検証から、emp テーブルに新しく追加されたフィールドfullname,modify_date,delete_flagインポート時に処理されず、NULL 値に設定されていることがわかります。処理する必要がある場合は、 MySQL支持的函數を使用して自分でデータを定義したり、LOAD 中に固定值ことができます。関数を使用してファイル内のフィールドを処理することもできます。インポートとエクスポートを組み合わせることで、以下に示すように、簡単な ETL 関数を実装できます。

-- データのインポート ステートメント load data infile '/data/mysql/3306/tmp/employees.txt'
テーブルdemo.empに置き換えます
文字セット utf8mb4
フィールドは ',' で終了します
'"' で囲まれている
'\n' で終了する行
(@C1、@C2、@C3、@C4、@C5、@C6) -- この部分は、employees.txt ファイル内の 6 列のデータに対応します -- 次の部分は、テーブル内のフィールドをデータ ファイルのフィールドに明確にマッピングします。存在しないデータは関数処理によって生成されます (固定値に設定することもできます)
emp_no=@C1 に設定し、
   生年月日=@C2,
   first_name=upper(@C3), -- インポートしたデータを大文字に変換します last_name=lower(@C4), -- インポートしたデータを小文字に変換します fullname=concat(first_name,' ',last_name), -- first_name と last_name を連結します gender=@C5,
   雇用日=@C6、
   modify_date=now(), -- 現在の時刻データを生成します delete_flag=if(hire_date<'1988-01-01','Y','N'); -- 特定の列に基づいて生成される値に対して条件付き操作を実行します

シナリオ4. 固定長データのロード

固定長データの特徴は以下のとおりです。関数を使用することで、文字列内の固定長を抽出し、指定した列データを生成することができます。

SQL > 選択 
    c1をsample_dataとして、
    substr(c1,1,3) を c1 として、
    substr(c1,4,3) を c2 として、
    substr(c1,7,2) を c3 として、
    substr(c1,9,5) を c4 として、
    substr(c1,14,3) を c5 として、
    t1からc6としてsubstr(c1,17,3)
    
************************** 1. 行 ****************************
sample_data: ABC Yu Zhenxing CD MySQL EF G データベース c1: ABC
         c2: ユ・ジェンシン c3: CD
         c4: MySQL
         c5: EFG
         c6: データベース

固定長データのインポートでは、データの各列が占める文字数を明確にする必要があります。次の例では、rpad を使用して既存のテーブル データ内のスペースを埋め、固定長データを生成します。

-- 固定長データを生成するSQL > select 
    連結(rpad(emp_no,10,' '),
          rpad(生年月日,19,' '),
          rpad(first_name,14,' '),
          rpad(姓,16,' '),
          rpad(性別,2,' '),
          rpad(hire_date,19,' ')) を固定長データとして 
      従業員から。従業員の上限は 10 人です。

+--------------------------------------------------------------------------------------------------+
| 固定長データ |
+--------------------------------------------------------------------------------------------------+
| 10001 1953-09-02 ゲオルギ・ファセロ M 1986-06-26 |
| 10002 1964-06-02 ベザレル・シメル F 1985-11-21 |
| 10003 1959-12-03 パート バンフォード M 1986-08-28 |
| 10004 1954-05-01 クリスチャン・コブリック M 1986-12-01 |
| 10005 1955-01-21 キョウイチ マリニアック M 1989-09-12 |
| 10006 1953-04-20 アネケ・プロイジグ F 1989-06-02 |
| 10007 1957-05-23 ツヴェタン・ジエリンスキ F 1989-02-10 |
| 10008 1958-02-19 サニヤ・カルーフィ M 1994-09-15 |
| 10009 1952-04-19 スマント・ピース F 1985-02-18 |
| 10010 1963-06-01 ドゥアンカエウ・ピヴェトー F 1989-08-24 |
+--------------------------------------------------------------------------------------------------+

-- 固定長データをエクスポートする選択 
    連結(rpad(emp_no,10,' '),
          rpad(生年月日,19,' '),
          rpad(first_name,14,' '),
          rpad(姓,16,' '),
          rpad(性別,2,' '),
          rpad(hire_date,19,' ')) を固定長データとして 
出力ファイル '/data/mysql/3306/tmp/employees_fixed.txt' へ
文字セット utf8mb4
'\n' で終了する行
従業員から。従業員の上限は 10 人です。

--エクスポートデータの例 [root@10-186-61-162 tmp]# cat employees_fixed.txt
10001 1953-09-02 ゲオルギ・ファセロ M 1986-06-26
10002 1964-06-02 ベザレル・シメル F 1985-11-21
10003 1959-12-03 パート バンフォード M 1986-08-28
10004 1954-05-01 クリスチャン・コブリック M 1986-12-01
10005 1955-01-21 キョウイチ・マリニアック M 1989-09-12
10006 1953-04-20 アネケ・プロイジグ F 1989-06-02
10007 1957-05-23 ツヴェタン・ジエリンスキ F 1989-02-10
10008 1958-02-19 サニヤ・カルーフィ M 1994-09-15
10009 1952-04-19 スマント・ピース F 1985-02-18
10010 1963-06-01 ドゥアンカエウ・ピヴェトー F 1989-08-24

-- 固定長データをインポートします。load data infile '/data/mysql/3306/tmp/employees_fixed.txt'
テーブルdemo.empに置き換えます
文字セット utf8mb4
フィールドは ',' で終了します
'"' で囲まれている
'\n' で終了する行
(@row) -- データの行をセット全体として定義します emp_no = trim(substr(@row,1,10)), -- substr を使用して最初の 10 文字を取得し、先頭と末尾のスペースを削除します birth_date = trim(substr(@row,11,19)), -- 後続のフィールドも同様です first_name = trim(substr(@row,30,14)),
   last_name = トリム(substr(@row,44,16))、
   fullname = concat(first_name,' ',last_name), -- first_name と last_name を連結します。gender = trim(substr(@row,60,2)),
   雇用日 = トリム(substr(@row,62,19))、
   修正日 = now(),
   delete_flag = if(hire_date<'1988-01-01','Y','N'); -- 特定の列に基づいて生成される値に対して条件付き操作を実行します

5. LOADの概要

1. デフォルトでは、テキスト ファイル内のインポート順序は列-從左到右,行-從上到下ます。

2. テーブル構造とテキスト データに矛盾がある場合は、データが間違ったフィールドにインポートされないように、テキスト ファイル内の列に順番に番号を付け、テーブル内のフィールドとのマッピング関係を確立することをお勧めします。

3. インポートするテキストファイルが大きい場合は、splitコマンドなどを使用して、按行拆分ことをお勧めします。

4. ファイルをインポートした後、次のステートメントを実行して、インポートされたデータにWarningERRORおよびインポートされたデータの量があるかどうかを確認することをお勧めします。

  • GET DIAGNOSTICS @p1=NUMBER,@p2=ROW_COUNT;
  • select @p1 AS ERROR_COUNT,@p2 as ROW_COUNT;

5. テキスト ファイルのデータとテーブル構造に大きな違いがある場合、またはデータをクリーンアップして変換する必要がある場合は、専門的な ETL ツールを使用するか、MySQL に大まかにインポートしてから処理して変換することをお勧めします。

上記は、MySQL Load Data のさまざまな使用方法の詳細な内容です。MySQL Load Data の使用方法の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。今後とも123WORDPRESS.COMをよろしくお願いいたします!

以下もご興味があるかもしれません:
  • Springbootはspring-data-jpaを使用してMySQLデータベースを操作します
  • DataGripはMysqlに接続してデータベースを作成します
  • Springboot は、mysql データベース spring.datasource.url エラーの解決策を構成します
  • mysqlのデータディレクトリ内のファイルを直接コピーしてデータを復元する実装
  • Python pymysql リンク データベース クエリ結果を Dataframe インスタンスに変換
  • MySQLデータベースデータの基本操作

<<:  Docker Composeオーケストレーションツールの詳細な説明

>>:  この記事では、Viteがブラウザのリクエストに対して何を行うかを説明します。

推薦する

Springboot+Vue-Cropperでアバターの切り取りとアップロードの効果を実現

アバターをアップロードするにはVue-Cropperコンポーネントを使用します。参考までに具体的な内...

TypeScript 名前空間のマージの説明

目次同じ名前の名前空間をマージする名前空間とその他の種類のマージ同じ名前の名前空間とクラスをマージす...

HTML テーブルタグチュートリアル (19): 行タグ

<TR> タグの属性は、次の表に示すように、テーブル内の各行のプロパティを設定するために...

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

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

Vueのカスタムイベントコンテンツ配信の詳細な説明

1. これは理解するのが少し複雑なので、原理を注意深く読んで自分で入力していただければ幸いです。 &...

JavaScript でカルーセル効果を実装する

この記事では、カルーセルの効果を実現するためのJavaScriptの具体的なコードを参考までに共有し...

CentOS8 で Docker を使用してオープンソース プロジェクト Tcloud をデプロイするチュートリアル

1. Dockerをインストールする1. 仮想マシンに Centos7 をインストールしました。Li...

SpringBoot プロジェクトの Docker 環境を実行するときに発生する無限再起動問題の詳細な説明

もしかしたら私の考え方が間違っていたのかもしれないし、問題の説明が少し乱雑だったのかもしれないが、こ...

クリーンなコードのための Web デザインの 12 の法則 [グラフィック]

美しいコードは美しい Web サイトの基礎です。優れた CSS は、同様に優れた HTML の上にの...

CMD で MySQL データベースを操作するときに中国語の文字化けが発生する問題の解決方法

Baiduで検索しました。 。 chcp コマンドを使用して、cmd の文字エンコーディングを 65...

Nodeはkoa2を使用してシンプルなJWT認証方式を実装します

JWT の紹介JWTとは正式名称はJSON Web Tokenで、現在最も人気のあるクロスドメイン認...

MySQL 独立インデックスと共同インデックスの選択

複数列のインデックスについては、理解が不足していることがよくあります。よくある間違いは、多数の列に独...

MySQL 8.0 パスワード有効期限ポリシーの詳細な説明

MySQL 8.0.16 以降では、パスワードの有効期限ポリシーを設定できます。今日は、この小さな知...

要素フォーム検証で検証プロンプトをクリアする方法

目次問題のシナリオ:解決: 1. フィールドを個別にチェックする2. フォームフィールドの下のフィー...

CSS を使用して fullpage.js のフルスクリーン スクロール効果を実装するサンプル コード

最近 CSS を勉強していたとき、 2 つの CSS プロパティだけを使用して全画面スクロール効果を...