[MySQL] LOAD DATA LOCAL INFILE でCSVをインポート

PHPSQL

CSV ファイルのデータを MySQL データベースにインポートする方法。
大量のデータを、高速に取り込むことができるという。

構文

[] に囲まれているのは省略可。

LOAD DATA LOCAL
INFILE 'ファイル名'
    [REPLACE | IGNORE]
    INTO TABLE テーブル名
    [FIELDS
        [TERMINATED BY '区切り文字']
        [[OPTIONALLY] ENCLOSED BY '囲み文字']
        [ESCAPED BY 'エスケープシーケンス' ]
    ]
    [LINES TERMINATED BY '行の改行文字']
    [IGNORE 数値 LINES]
    [(@CSVの項目値を格納する変数, ...)]
    [SET DBのカラム名 = @CSV変数 または 任意の値, ...]
REPLACE : 主キーやユニークキーが重複した場合、入力値で書き換えられる。( DELETEINSERT される。)
IGNORE : 主キーやユニークキーが重複した場合、スキップされる。(書き換えられない。)
LINES : 行の改行文字。デフォルト値は '\n'
FIELDS : 区切り文字。デフォルト値はタブ。
@CSVの項目値を格納する変数 : ここで指定した変数に CSV の項目値が左から順に格納される。変数名は @ + なんでもいい。

13.2.6 LOAD DATA INFILE 構文

CSV ファイルをインポート

CSV ファイルのデータが、左から順にカラムに挿入されていく。

LOAD DATA LOCAL INFILE 'hoge.csv' INTO TABLE sector FIELDS TERMINATED BY ',';

特定のカラムにインポート

インポートするカラムを指定する方法。

LOAD DATA LOCAL INFILE "CSV ファイルパス"
INTO TABLE テーブル名
FIELDS TERMINATED BY '区切り文字'
[LINES TERMINATED BY '行の改行文字']
[IGNORE 1 LINES]
(@1,@2,@3)
SET columnA=@1, columnB=@3;

CSV ファイルにない値を挿入

CSV にはない、任意の値を挿入する。

LOAD DATA LOCAL INFILE "CSV ファイルパス"
INTO TABLE テーブル名
FIELDS TERMINATED BY '区切り文字'
[LINES TERMINATED BY '行の改行文字']
[IGNORE 1 LINES]
SET columnA=任意の値;

条件分岐させる場合

CASE 文を使う。

(@1,@2,@3)
SET columnA=CASE @2
        WHEN 条件値1 THEN 処理
        WHEN 'hoge' THEN NULL
        ELSE @2
    END,
    columnB=@3;

CSV に囲み文字があったりなかったりする場合

大部分が囲み文字なしだが、値に「カンマ(,)」が含まれる場合のみダブルクォートで囲まれているとき。
ENCLOSED BY を使う。 OPTIONALLY はあってもなくても同じ結果だった。

[OPTIONALLY] ENCLOSED BY '\"'

Posted by Agopeanuts