テーブルからファイルにデータを書き込むには、SELECT … INTO OUTFILE を利用してください。
テーブルにファイルをリード バックするには、LOAD DATA INFILE を利用してください。
両方のステートメントに対して FIELDS と LINES 条項の構文は同じです。
条項は両方とも任意ですが、もし両方が指定された場合 FIELDS は LINES に先行しなければいけません。

SELECT … INTO OUTFILE

SELECT の SELECT … INTO OUTFILE ‘file_name’ 型は選択された行をファイルに書き込みます。
ファイルはサーバ ソフト上に作成されるので、この構文を利用するには FILE 権限を持たなければいけません。
file_name は、/etc/passwd のようなファイルやデータベース テーブルが、その他の物の間で破壊されるのを防ぐ
既存ファイルにはなり得ません。MySQL 5.1.6 以降のバージョンでは、character_set_filesystem システム変数は、
ファイル名の解明をコントロールします。

SELECT … INTO OUTFILE ステートメントは、サーバ マシン上のテキスト ファイルにテーブルをすばやく
書き出す事ができます。もしサーバ ホストではなく、クライアント ホスト上に結果ファイルを
作成したければ、SELECT … INTO OUTFILE を利用する事はできません。
その場合、クライアント ホスト上にファイルを生成する為には、代わりに mysql -e “SELECT …” > file_name
のようなコマンドを利用しなければいけません。
SELECT … INTO OUTFILE は LOAD DATA INFILE の補数です。


SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM test_table;


SELECT ID,Name,Population INTO OUTFILE '/tmp/City20091218.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM Study.City;

select_into_outfile1

LOAD DATA INFILE

LOAD DATA INFILE ステートメントは高スピードでテキスト ファイルからテーブルに行を読み込みます。
ファイル名は直定数文字列として与えられなければいけません。
LOAD DATA INFILE は SELECT … INTO OUTFILE の補数です。

mysqlimport ユーティリティを利用する事でデータ ファイルをロードする事もできます。
これは、サーバに LOAD DATA INFILE ステートメントを送信する事で機能します。–local オプション
は mysqlimport がクライアント ホストからデータファイルを読み込むよう働きかけます。
もしクライアントとサーバが圧縮されたプロトコルをサポートするなら、スピードが遅いネットワークにより
良い性能を得る為に –compress オプションを指定する事ができます。

LOCAL キーワードが指定されたら、それは接続の最後にクライアントに関して解明されます。

* もし LOCAL が指定されると、ファイルはクライアント ホスト上のクライアントプログラムによって読み込まれ、
サーバに送られます。ファイルは、その明確な場所を指定する為の完全なパス名として与えられます。
もしそのパス名が相対的な物として与えられると、その名前はクライアントプログラムが開始されたディレクトリ
と比較して解明されます。

* もし LOCAL が指定されなければ、ファイルはサーバ ホスト上に置かれ、サーバによって直接読み込まれる必要があります。

サーバはファイルを置く為に次のルールを利用します。

* もしファイル名が完全なパス名であれば、サーバはそれをそのまま利用します。
* もしファイル名が1つ、または複数の主要コンポネントを持つ相対的なパス名であれば、
サーバはそのデータ ディレクトリに関連するファイルを検索します。
* もし主要コンポネントを持たないファイル名が与えられると、サーバはデフォルト データベース
のデータベース ディレクトリ内のファイルを探します。

これらのルールは、非 LOCAL の場合、 ./myfile.txt としてのファイル名はサーバーのデータ ディレクトリ
から読まれ、その一方、myfile.txt としてのファイル名はデフォルト データベースのデータベース ディレクトリ
から読み込まれるという事を意味しますので、注意してください。例えば、もし db1 がデフォルト データベースなら、
ステーメントが db2 データベース内のテーブルにファイルを明示的にロードしたとしても、
次の LOAD DATA ステートメントが db1 のデータベース ディレクトリからファイル data.txt を読み込みます。

LOAD DATA INFILE ‘data.txt’ INTO TABLE db2.my_table;

ローカル ファイルをロードするのに FILE 特権は必要ありません。
LOCAL は、サーバとクライアントの両方が、これを許容できる場合のみ機能します。
例えば、もし mysqld が –local-infile=0 と共に開始された場合、LOCAL は機能しません。


SELECT ID,Name,Population INTO OUTFILE '/tmp/City20091218.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM STUDY.City;


CREATE TABLE `LOAD_D_CITY` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `idx_City_Name` (`Name`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;


LOAD DATA INFILE '/tmp/City20091218.txt' INTO TABLE LOAD_D_CITY
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';

load_data_infile

12.2.7. SELECT 構文
12.2.5. LOAD DATA INFILE 構文

Comments are closed.

Post Navigation