LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
    [REPLACE | IGNORE]
    INTO TABLE tbl_name
    [FIELDS
        [TERMINATED BY '\t']
        [[OPTIONALLY] ENCLOSED BY '']
        [ESCAPED BY '\\' ]
    ]
    [LINES 
        [STARTING BY '']    
        [TERMINATED BY '\n']
    ]
    [IGNORE number LINES]
    [(col_name,...)]
        LOAD DATA INFILE
        ステートメントは、テキストファイルからテーブルにレコードを高速で読み取ります。LOCAL
        キーワードが指定されている場合、このキーワードは接続のクライアント側に関連して解釈されます。LOCAL
        が指定されていると、クライアントホスト上のクライアントプログラムによってファイルが読み取られ、サーバに送られます。LOCAL
        が指定されていない場合、ファイルはサーバホスト上に存在しなければならず、サーバによって直接読み取られなければなりません(LOCAL
        は MySQL バージョン 3.22.6
        以降で使用できます)。
      
        セキュリティ上の理由から、サーバに存在するテキストファイルを読み取るときには、そのファイルがデータベースディレクトリに存在するか、または全ユーザがそのファイルを読み取り可能でなければなりません。また、サーバのファイルに対して
        LOAD DATA INFILE
        を使用するには、サーバホストでの
        FILE 権限が必要になります。
      
        MySQL 3.23.49 と MySQL 4.0.2(Windows では
        4.0.13)以降では、LOCAL
        はサーバとサーバクライアントの両方でこれが有効として設定されている場合にのみ機能します。たとえば、--local-infile=0
        を指定して mysqld
        を起動した場合、LOCAL
        は機能しません。 See
        項4.3.4. 「LOAD DATA LOCAL のセキュリティ関連事項」。
      
        キーワード LOW_PRIORITY
        を指定すると、LOAD DATA
        ステートメントの実行は、他のクライアントによるテーブルからの読み取りが終了するまで遅らされます。
      
        MyISAM
        テーブルに対してキーワード
        CONCURRENT を指定すると、LOAD
        DATA
        の実行中に他のスレッドがこのテーブルからデータを取り出すことができます。当然ながら、このオプションの使用は、同時にテーブルを使用している他のスレッドがなくても、LOAD
        DATA
        のパフォーマンスに多少影響します。
      
        LOCAL
        を指定した場合、ファイルの内容を接続によってクライアントからサーバに送らなければならないため、サーバがファイルに直接アクセスする場合よりも処理がやや遅くなります。その反面、ローカルファイルのロードには
        FILE 権限は必要ありません。
      
        バージョン 3.23.24 より前のバージョンの MySQL
        を使用している場合は、LOAD DATA
        INFILE を使用して FIFO
        から読み取ることはできません。FIFO
        から読み取る必要がある場合は(gunzip
        の出力など)、代わりに LOAD DATA LOCAL
        INFILE を使用します。
      
        データファイルのロードは、mysqlimport
        ユーティリティでも実行できます。この場合、LOAD
        DATA INFILE
        コマンドがサーバに送られます。--local
        オプションを指定した mysqlimport
        では、データファイルがクライアントホストから読み取られます。--compress
        オプションを指定すると、クライアントとサーバで圧縮されたプロトコルがサポートされている場合に、速度の遅いネットワークのパフォーマンスを良くすることができます。
      
ファイルがサーバホスト上にある場合、サーバは次の規則に従います。
絶対パス名が指定されている場合、サーバはそのパス名をそのまま使用する。
相対パス名が指定されている場合、サーバはサーバのデータディレクトリを基準にしてファイルを検索する。
ディレクトリの指定なしにファイル名が指定されている場合、サーバはカレントデータベースのデータベースディレクトリでファイルを検索する。
        注意:
        これらの規則に基づき、./myfile.txt
        という名前のファイルはサーバのデータディレクトリから読み取られるのに対し、myfile.txt
        という名前の同じファイルについてはカレントデータベースのデータベースディレクトリから読み取られます。たとえば、次の
        LOAD DATA
        ステートメントでは、db2
        データベース内のテーブルへのファイルのロードが明示的に指定されていますが、ファイル
        data.txt
        はカレントデータベースである
        db1
        のデータベースディレクトリから読み取られます。
      
mysql>USE db1;mysql>LOAD DATA INFILE "data.txt" INTO TABLE db2.my_table;
        REPLACE キーワードと
        IGNORE
        キーワードでは、既存のレコードの値と重複するユニークキー値を持つ入力レコードの処理が制御されます。
      
        REPLACE
        が指定されている場合、入力レコードによって既存のレコードが置き換えられます(つまり、レコードのプライマリまたはユニークインデックスの値が既存のレコードの値と同じである場合、そのレコードによって既存のレコードが置き換えられます)。
        See 項6.4.7. 「REPLACE 構文」。
      
        IGNORE
        が指定されている場合、ユニークキー値が既存のレコードの値と重複する入力レコードがスキップされます。
        どちらのオプションも指定されていない場合、動作は
        LOCAL
        キーワードが指定されているかどうかによって異なります。
        LOCAL
        が指定されていない場合、重複したキーの値が検出されるとエラーになり、テキストファイルの残りの部分が無視されます。
        LOCAL
        が指定されている場合、デフォルトの動作は
        IGNORE
        が指定されている場合と同じです。なぜなら、サーバは処理の最中にファイルの送信を停止することができないためです。
      
        ロード時に外部キー制約を無視するには、LOAD
        DATA の実行前に SET
        FOREIGN_KEY_CHECKS=0 を指定します。
      
        空の MyISAM テーブルに対して
        LOAD DATA INFILE
        を使用すると、非ユニークなインデックスのすべてが別のバッチに作成されます(REPAIR
        の場合と同様)。インデックスが数多くある場合、通常、これによって
        LOAD DATA INFILE
        の処理がはるかに迅速化されます。通常、この処理は非常に迅速ですが、極端なケースでは、ALTER
        TABLE .. DISABLE KEYS
        でインデックスを無効にした後、ALTER
        TABLE .. ENABLE KEYS
        を使用してインデックスを再作成する方がさらに迅速にインデックスを作成できることもあります。
        See 項4.5.6. 「myisamchk
        を使用したテーブルの保守とクラッシュのリカバリ」。
      
        LOAD DATA INFILE は SELECT ... INTO
        OUTFILE の逆です。 See
        項6.4.1. 「SELECT 構文」。
        テーブルからファイルにデータを書き込むには、SELECT
        ... INTO OUTFILE を使用します。
        ファイルを再びテーブルに読み取るには、LOAD
        DATA INFILE を使用します。
        FIELDS 節と LINES
        節の構文は、どちらのコマンドでも同じです。どちらの節もオプションとして指定できますが、これらの節を両方とも指定する場合は、FIELDS
        を LINES
        より前に指定する必要があります。
      
        FIELDS
        節を指定する場合は、その節の従属節(TERMINATED
        BY、[OPTIONALLY] ENCLOSED
        BY、ESCAPED BY)
        もオプションとして指定できますが、少なくともこれらのうちの
        1 つは必ず指定する必要があります。
      
        FIELDS
        節を指定しない場合、デフォルトは次のように記述した場合と同じです。
      
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
        LINES
        節を指定しない場合、デフォルトは次のように記述した場合と同じです。
      
LINES TERMINATED BY '\n'
        注意: Winodows
        では行終端記号として 2
        文字を使用しているため、テキストファイルを
        Windows
        システムで生成した場合は、通常、上の記述を
        LINES TERMINATED BY '\r\n'
        に変更する必要があります。wordpad
        などの一部のプログラムでは、行終端記号として
        \r を使用できます。
      
        読み取り対象行のすべてに存在するプリフィックスをスキップする必要があるときは、LINES
        STARTING BY prefix_string を使用できます。
      
        したがって、デフォルトの LOAD DATA
        INFILE
        は入力データの読み取り時に次のように動作します。
      
改行文字では、行の境界を探す。
            LINES STARTING BY prefix
            が指定されている場合、プリフィックスが検出されるまで読み取り、プリフィックスの後ろにある文字から再び読み取りを開始する。行にプリフィックスが含まれていない場合は、その行をスキップする。
          
タブ文字では、行をフィールドに区切る。
フィールドはどの引用文字にも囲まれていないとみなす。
            ‘\’
            に続くタブ、改行、‘\’
            の各文字は、フィールド値の一部を成すリテラル文字として解釈する。
          
        逆に、デフォルトの SELECT ... INTO
        OUTFILE
        は出力の書き込み時に次のように動作します。
      
フィールド間にはタブ文字を書き込む。
フィールドは引用文字で囲まない。
            フィールド値内のタブ、改行、‘\’
            の各文字は、それぞれ
            ‘\’
            でエスケープする。
          
行末には改行文字を書き込む。
        注意: FIELDS ESCAPED BY '\\'
        と記述する際には、単一バックスラッシュとして読み取らせる値を表すものとして、バックスラッシュを
        2 つ指定する必要があります。
      
        IGNORE number LINES
        オプションは、ファイルの先頭にある行を無視させる目的で使用します。たとえば、次のように、IGNORE
        1 LINES
        と指定することによって、カラム名が含まれた最初のヘッダ行(1
        行)をスキップさせることができます。
      
mysql> LOAD DATA INFILE "/tmp/file_name" INTO TABLE test IGNORE 1 LINES;
        SELECT ... INTO OUTFILE と LOAD
        DATA INFILE
        を並行して使用して、データベースからファイルにデータを書き込み、その後ファイルからデータベースに再び読み取る場合は、フィールドと行の処理に関する両方のコマンドのオプションが一致していなければなりません。一致していない場合、ファイルの内容が
        LOAD DATA INFILE
        によって正しく解釈されません。たとえば、SELECT
        ... INTO OUTFILE
        を使用して、カンマで区切られたフィールドを持つファイルを書き込むとします。
      
mysql>SELECT * INTO OUTFILE 'data.txt'->FIELDS TERMINATED BY ','->FROM ...;
カンマで区切られたファイルを再び読み取る正しいステートメントは、次のようになります。
mysql>LOAD DATA INFILE 'data.txt' INTO TABLE table2->FIELDS TERMINATED BY ',';
        上のステートメントではなく、次に示すステートメントでファイルを読み取ろうとすると、処理は正しく行われません。なぜなら、このステートメントでは、フィールド間にタブ文字を探すよう
        LOAD DATA INFILE
        に指示しているためです。
      
mysql>LOAD DATA INFILE 'data.txt' INTO TABLE table2->FIELDS TERMINATED BY '\t';
この場合、入力ファイルの各行が単一のフィールドとして解釈されてしまいます。
        LOAD DATA INFILE
        では、外部ソースから得られたファイルを読み取ることもできます。たとえば、dBASE
        形式のファイルには、カンマで区切られ、かつ二重引用符で囲まれたフィールドが含まれています。ファイルの各行の終端が改行文字によって示されている場合、このファイルをロードするには次のコマンドを使用します。このコマンドでは、このファイルのフィールドと行の処理に関するオプションを指定しています。
      
mysql>LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name->FIELDS TERMINATED BY ',' ENCLOSED BY '"'->LINES TERMINATED BY '\n';
        フィールドや行の各処理オプションには、いずれも空の文字列('')を指定することができます。空の文字列でない場合、FIELDS
        [OPTIONALLY] ENCLOSED BY と FIELDS ESCAPED
        BY
        の値は単一の文字でなければなりません。FIELDS
        TERMINATED BY と LINES TERMINATED
        BY
        の値には、複数の文字も使用できます。たとえば、終端に改行/復帰のペアが付いた行を書き込んだり、このような行を含むファイルを読み取る場合は、LINES
        TERMINATED BY '\r\n' 節を指定します。
      
        たとえば、%%
        の行で区切られたジョーク集のファイルを SQL
        テーブルに読み取る場合は、次のように記述します。
      
CREATE TABLE jokes (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joke TEXT NOT NULL); LOAD DATA INFILE "/tmp/jokes.txt" INTO TABLE jokes FIELDS TERMINATED BY "" LINES TERMINATED BY "\n%%\n" (joke);
        FIELDS [OPTIONALLY] ENCLOSED BY
        では、フィールドの引用処理が制御されます。出力(SELECT
        ... INTO
        OUTFILE)の場合、OPTIONALLY
        という語を省略すると、すべてのフィールドが
        ENCLOSED BY
        指定文字で囲まれます。このような出力(フィールド区切り記号としてカンマを使用したもの)の例を、次に示します。
      
"1","a string","100.20" "2","a string containing a , comma","102.20" "3","a string containing a \" quote","102.20" "4","a string containing a \", quote and comma","102.20"
        OPTIONALLY
        を指定すると、ENCLOSED BY
        指定文字は CHAR 型と
        VARCHAR
        型のフィールドを囲むためだけに使用されます。
      
1,"a string",100.20 2,"a string containing a , comma",102.20 3,"a string containing a \" quote",102.20 4,"a string containing a \", quote and comma",102.20
        注意: フィールド値内に ENCLOSED BY
        指定文字が含まれる場合は、直前に
        ESCAPED BY
        指定文字を付けることによってエスケープされます。注意:
        ESCAPED BY
        に空の文字列を指定すると、生成された出力を
        LOAD DATA INFILE
        が正しく読み取れないことがあります。たとえば、エスケープ文字が空の場合、前出の例の出力は次のように表示されます。4
        行目の 2
        番目のフィールドには、引用符に続いてカンマが含まれています。このカンマはフィールドの(実際には終端記号ではないのに)終端記号のように見えます。
      
1,"a string",100.20 2,"a string containing a , comma",102.20 3,"a string containing a " quote",102.20 4,"a string containing a ", quote and comma",102.20
        入力の場合、フィールド値の終わりに
        ENCLOSED BY
        指定文字があると、その文字が除去されます(これは、OPTIONALLY
        の指定の有無にかかわらず適用されます。OPTIONALLY
        は入力の解釈には作用しません)。
        ESCAPED BY 指定文字に続いて
        ENCLOSED BY
        指定文字があると、その文字は、現在のフィールド値の一部を成すものとして解釈されます。
      
        フィールドが ENCLOSED BY
        指定文字で始まっている場合、後続の
        ENCLOSED BY
        指定文字は、その後ろにフィールドまたは行の
        TERMINATED BY
        指定文字列がある場合にのみ、フィールド値の終端として解釈されます。
        あいまい性を排除するため、ENCLOSED
        BY
        指定文字をフィールド内で通常の文字として使用する場合、2
        回続けて使用することで通常の 1
        文字として解釈させることができます。たとえば、ENCLOSED
        BY '"'
        と指定されている場合、引用符は次のように処理されます。
      
"The ""BIG"" boss" -> The "BIG" boss The "BIG" boss -> The "BIG" boss The ""BIG"" boss -> The ""BIG"" boss
        FIELDS ESCAPED BY
        では、特殊文字の書き込みと読み取り方法が制御されます。FIELDS
        ESCAPED BY
        に空以外の文字が指定されている場合、出力でその文字が次の文字の前に付けられます。
      
            FIELDS ESCAPED BY 指定文字自体
          
            FIELDS [OPTIONALLY] ENCLOSED BY
            指定文字
          
            FIELDS TERMINATED BY と LINES
            TERMINATED BY
            に指定された値の最初の文字
          
            ASCII
            0(エスケープ文字に続いて実際に記述されるのは、ゼロ値のバイトではなく
            ASCII '0')
          
        FIELDS ESCAPED BY
        の指定が空の場合、どの文字もエスケープ処理されません。
        データのフィールド値に上記の文字が含まれている場合は特に、エスケープ文字として空文字は指定すべきではありません。
      
        入力では、FIELDS ESCAPED BY
        に空以外の文字が指定されている場合、その文字は除去され、それに続く文字がフィールド値の一部として通常の文字と同じように解釈されます。ただし、‘0’
        または ‘N’
        がエスケープされている場合(たとえば、エスケープ文字が
        ‘\’ の場合の
        \0 または
        \N)は例外です。これらの文字列は
        ASCII 0(ゼロ値のバイト)および
        NULL として解釈されます。下記の
        NULL
        の処理に関する規則を参照してください。
      
        ‘\’
        を使用したエスケープ構文の詳細については、項6.1.1. 「リテラル:文字列と数値の記述方法」
        を参照してください。
      
場合によっては、次に示すように、フィールドと行の各処理オプションが相互に作用することがあります。
            LINES TERMINATED BY
            に空の文字列が指定されていて、FIELDS
            TERMINATED BY
            に空以外の文字列が指定されている場合、行の終端も
            FIELDS TERMINATED BY
            指定文字列によって示される。
          
            FIELDS TERMINATED BY と FIELDS
            ENCLOSED BY
            の値がどちらも空('')の場合、固定レコード(区切りなし)の形式が使用される。
            固定長レコードの形式では、フィールド間に区切り記号は使用されない(行終端記号は使用可能)。代わりに、カラムの
            ``表示''
            幅に基づいてカラム値が読み書きされる。たとえば、カラムが
            INT(7)
            として宣言されている場合、そのカラムの値は
            7
            文字のフィールドを使用して書き込まれる。人力時には、そのカラムの値は、7
            文字を読み取ることによって取得される。
          
            この場合も、各行の分離には、LINES
            TERMINATED BY が使用される。1
            行にすべてのフィールドが含まれていない場合、残りのフィールドにはそれぞれのデフォルト値が設定される。行終端記号がない場合は、終端記号を
            ''
            として指定するようにする。この場合、テキストファイルに各レコードのすべてのフィールドが含まれていなければならない。
          
            固定長レコード形式は、NULL
            値の処理にも影響します。下記を参照。
            注意:
            マルチバイト文字のキャラクタセットを使用している場合、固定サイズ形式は機能しない。
          
        NULL 値の処理は、使用されている
        FIELDS オプションと
        LINES
        オプションによって異なります。
      
            FIELDS と LINES
            の値がデフォルトの場合、出力では
            NULL が \N
            として書き込まれ、入力では
            \N が NULL
            として読み取られる(ESCAPED BY
            指定文字が ‘\’
            の場合)。
          
            FIELDS ENCLOSED BY
            に空以外の文字が指定されている場合、リテラルの
            NULL
            を値として持つフィールドは
            NULL
            値として読み取られる(これは、FIELDS
            ENCLOSED BY 指定文字で囲まれた語
            NULL が、文字列
            'NULL'
            として読み取られるのと異なる)。
          
            FIELDS ESCAPED BY
            の指定が空の場合、NULL は
            NULL
            という語として書き込まれる。
          
            固定長レコード形式(FIELDS TERMINATED
            BY と FIELDS ENCLOSED BY
            の両方の指定が空の場合)では、NULL
            は空の文字列として書き込まれる。注意:
            それによって、ファイルへの書き込み時に、テーブル内の
            NULL
            値と空の文字列の両方が空の文字列として書き込まれるため、それらを区別できなくなる。ファイルを再び読み取るときにこれらを区別できるようにする必要がある場合は、固定レコード形式は使用しないようにする。
          
        次に示すケースは LOAD DATA INFILE
        でサポートしていません。
      
            固定長サイズのレコード(FIELDS
            TERMINATED BY と FIELDS ENCLOSED
            BY の指定がどちらも空)と
            BLOB または TEXT
            型のカラム。
          
            1
            つの区切り記号が別の区切り文字とまったく同じか、別の区切り記号の先頭の部分と同じである場合、LOAD
            DATA INFILE
            は入力を正しく解釈できない。たとえば、次の
            FIELDS 節では問題が発生する。
          
FIELDS TERMINATED BY '"' ENCLOSED BY '"'
            FIELDS ESCAPED BY
            の指定が空の場合、FIELDS ENCLOSED
            BY または LINES TERMINATED
            BY の指定文字に続いて FIELDS
            TERMINATED BY
            指定値があると、LOAD DATA INFILE
            はフィールドまたは行の読み取りを誤って早く停止する。
            これは、フィールドまたは行の値の終端を
            LOAD DATA INFILE
            が正しく判別できないために起こる。
          
        次の例では、persondata
        テーブルのすべてのカラムがロードされます。
      
mysql> LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
        フィールドリストは指定されていないため、LOAD
        DATA INFILE
        は入力レコードに各テーブルカラムのフィールドが含まれているとみなします。デフォルトの
        FIELDS 値と LINES
        値が使用されます。
      
テーブルの一部のカラムのみロードする場合は、フィールドリストを指定します。
mysql>LOAD DATA INFILE 'persondata.txt'->INTO TABLE persondata (col1,col2,...);
入力ファイル内のフィールドの順序がテーブルのカラムの順序と異なる場合も、フィールドリストを指定する必要があります。リストを指定しないと、入力フィールドとテーブルの各カラムをどのように一致させたらいいか MySQL で認識できません。
        レコードに含まれているフィールドの数が足りない場合、入力フィールドが欠落しているカラムにはデフォルト値が設定されます。デフォルト値の割り当てについては、項6.5.3. 「CREATE TABLE 構文」
        で説明しています。
      
空のフィールド値はフィールド値が欠落している場合とは異なる解釈をされます。
文字列型のカラムの場合は、値として空の文字列が設定される。
            数値型のカラムの場合は、値として
            0 が設定される。
          
日付と時刻型のカラムの場合は、値として、その型に対応する ``ゼロ'' 値が設定される。 See 項6.2.2. 「日付と時刻型」。
        注意: これらは、INSERT や
        UPDATE
        ステートメントで文字列型、数値型、日付または時刻型のカラムに空白の文字列を明示的に割り当てた場合と同じ値です。
      
        TIMESTAMP
        型のカラムでは、そのカラムに
        NULL 値(つまり
        \N)があるときか、フィールドリストの指定時にその
        TIMESTAMP
        型のカラムが省略されていたときだけ(これは最初の
        TIMESTAMP
        カラムに対してのみ適用)、カラムの値として現在の日時が設定されます。
      
        入力レコードに含まれるフィールドが多すぎる場合、余分なフィールドは無視され、警告数が加算されます。注意:
        MySQL 4.1.1
        より前のバージョンでは、警告は発生した何らかの問題を示す数でしかありませんでした。
        MySQL 4.1.1 では、SHOW WARNINGS
        によって、発生した問題の詳細を表示することができます。
      
        LOAD DATA INFILE
        はすべての入力を文字列としてみなすため、INSERT
        ステートメントの場合とは異なり、ENUM
        型や SET
        型のカラムに数値を使用することはできません。ENUM
        型と SET
        型の値はすべて文字列として指定する必要があります。
      
        C API を使用している場合は、LOAD DATA
        INFILE クエリの完了時に API 関数
        mysql_info()
        を呼び出すことによって、クエリに関する情報を取得できます。情報文字列の形式は次のとおりです。
      
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
        Warnings(警告)は、INSERT
        ステートメント(see
        項6.4.3. 「INSERT 構文」)で値を挿入するときと同じ状況で発生しますが、その他に、入力レコードに含まれるフィールドが多すぎる場合と少なすぎる場合にも警告が生成されます。警告はどこにも格納されません。単に、警告の数を、処理が正常に行われたかどうかを示すインジケータとして利用できるだけです。
      
        警告が出力された場合にその正確な理由を確認する必要があるときは、1
        つの方法として、SELECT ... INTO
        OUTFILE
        を使用して別のファイルに出力し、元の入力ファイルと比較することができます。
      
        LOAD DATA
        にパイプから読み取らせる必要がある場合は、次の方法を使用できます。
      
mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x cat < /dev/tcp/10.1.1.12/4711 > /nt/mysql/db/x/x mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x
        3.23.25 より前のバージョンの MySQL
        を使用している場合は、上記の方法は
        LOAD DATA LOCAL INFILE
        でのみ使用可能です。
      
        MySQL 4.1.1 では、SHOW WARNINGS
        を使用して、max_error_count
        に指定された数の警告の最初のリストを取得できます。
        See 項4.6.8.9. 「SHOW WARNINGS | ERRORS」。
      
        INSERT と LOAD DATA
        INFILE の効率性の比較や、LOAD DATA
        INFILE の迅速化の詳細については、See
        項5.2.10. 「INSERT クエリの速度」。
      
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.

