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.