MySQL – リレーションを持つCSVのインポート

概要

参照関係を持つテーブルにCSVデータをインポートすることを考える。

  • 親テーブルの主キーにAUTO_INCREMENTが設定されていて、子テーブルがそのキーを参照するリレーションを対象とする
  • データの追加ではなく、空のテーブルに新たにデータを登録するケースを対象とする

テーブル構成

以下のようなテーブル構造とする。

  • branchesテーブルは支社に関する情報を記録する
    • AUTO_INCREMENTの支社ID(プライマリーキー)
    • 支社名
  • warehousesテーブルは支社に属する倉庫に関する情報を記録する
    • AUTO_INCREMENTの倉庫ID(プライマリーキー)
    • 倉庫が属する支社を参照する支社ID(外部キー)
    • 倉庫名
  • customersテーブルは倉庫から出荷される先の顧客に関する情報を記録する
    • AUTO_INCREMENTの顧客ID(プライマリーキー)
    • 顧客を担当する倉庫のID(外部キー)
    • 顧客名

ExcelでCSVファイルの作成

元データの入力

以下の3つのテーブルデータを別のシートに入力する。

<branchesテーブル>

id name
1 関東支社
2 関西支社

<warehousesテーブル>

id branch_id name
1 1 千葉倉庫
2 1 八王子倉庫
3 2 東大阪倉庫
4 2 神戸倉庫

<customersテーブル>

id warehouse_id customer
1 1 山田商会
2 1 田中屋
3 2 中川商店
4 2 川井製作所
5 3 井戸商店
6 3 戸田商会
7 4 田村屋
8 4 村山製作所

CSVファイルの保存

3つのシートそれぞれをCSVファイルで保存する。

  • 名前を付けて保存
  • ファイルの種類は”CSV UTF-8 (コンマ区切り)”
  • シートごとに別々のCSVファイルに保存

BOMなしへの変換

ExcelのUTF-8はBOM付きで保存されるので、これをBOMなしのUTF-8に変換する。

たとえば、Windowsのメモ帳で読み込んでUTF-8(BOM付きではない方)で保存し直すなど。

ファイルの提供

外部サーバーの場合、FTPで所定の場所にCSVファイルをアップロード。

Vagrant仮想環境の場合、保存されたCSVファイルを共有ディレクトリーにコピーまたは移動。

MySQLでの操作

ローカルファイルを許可してログイン

MySQLにログインするのに、--enable-local-infileを指定してローカルファイルからの入力を許可。

MySQL内でローカルファイルの入力許可

@@local_infile変数の内容をチェックする。0の場合はローカルファイル入力が許可されていないので、SET GLOBALで許可する。

テーブルの準備

CREATE TABLEでCSVデータを読み込むテーブルを準備する。

作成したテーブルの構造。

CSVファイルの読み込み

アップロードまたは共有されたCSVファイルをLOAD DATA LOCAL INFILEクエリーで読み込む。

  • カンマ区切り→FILES TERMINATED BY ','
  • 改行コード→LINES TERMINATED BY '\r\n'
  • 1行目が見出し行の場合→IGNORE 1 LINES

読み込み結果の確認

各テーブルデータの確認

参照関係の確認

外部キーによる参照関係の確認。各外部キーと親テーブルのキーでテーブルを結合。

実行結果。

新規追加の確認

たとえば新たな支社を1つ追加し、AUTO_INCREMENTが機能していることを確認。

外部結合してみる。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です