テーブルからファイルにデータを書き込むには、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 構文


LOAD DATA INFILEでもMYSQLIMPORTコマンドのどちらでもデータを
テーブルにIMPORTできるのでどちらでも良いのですが、
バッチから利用するのであればMYSQLIMPORTの方が楽なのかな?
慣れればどちらも良いですが..

1) テストtableの作成
mysql -e 'CREATE TABLE M_IMPORT(id INT,n varchar(10))' STUDY -u root -p

2) テスト用テキストファイルの作成

3) データファイルのIMPORT
mysqlimport --local STUDY M_IMPORT.txt -u root -p

4) IMPORTしたデータの確認
mysql -e 'select * from M_IMPORT' STUDY -u root -p

mysqlimport_2nd
※ IMPORTするテキストファイル名はIMPORT先のテーブル名と同じ。

[od コマンド]
od バイナリ・ファイルの内容を閲覧する

od [-abcdfhiloxv] [-s[bytes]] [-w[bytes]] [-A radix] [-jbytes] [-N bytes] [-t type]
[–skip-bytes=bytes][–address-radix=radix] [–read-bytes=bytes] [–format=type]
[–output-duplicates] [–strings[=bytes]][–width[=bytes]] [–traditional] [file…]

MYSQLIMPORT復習
【 od 】 バイナリ・ファイルの内容を閲覧する
Linuxコマンド集


LOAD DATA INFILE は SELECT … INTO OUTFILE の補数です。

    テーブルからファイルにデータを書き込むには、SELECT … INTO OUTFILE を利用してください。

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


select PID,NAME
INTO OUTFILE 'project.dat'
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
FROM project
ORDER BY id
LIMIT 5;

into_out_file


select *
INTO OUTFILE 'project.dat'
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
FROM project
ORDER BY id
LIMIT 5;


select *
INTO OUTFILE 'project_no_option.dat'
FROM project;

into_out_file_no_option

参考サイト
12.2.5. LOAD DATA INFILE 構文

12.2.7. SELECT 構文


REPLACEオプションで指定したテーブルに対して、
まったく同じデータをIGNOREオプションを指定してLOADしてみました。

IGNORE を指定すると、 固有キー値上の、既存行を複製するインプット行はスキップされます。
もしどちらのオプションも指定しなければ、その動作は LOCAL キーワードが指定されたかどうかによって
決まります。LOCAL を利用すると、複製キー値が見つかった時点でエラーが発生し、テキスト ファイル
の残りは無視されます。LOCAL を使用しなければ、デフォルトの動作は IGNORE が指定された時と
同じです。これは、サーバは操作の最中にファイルの送信を中止する事ができないからです。

mysql> LOAD DATA INFILE '/tmp/MYSQLIMP.txt' IGNORE INTO TABLE MYSQLIMP;
Query OK, 0 rows affected (0.00 sec)
Records: 4 Deleted: 0 Skipped: 4 Warnings: 0

メモ
①テキストファイルから4ラインが読み込まれた
②4件のデータが同じ値だったのでSKIPされた。(PKあり)

load_data_infile_ignore


REPLACE と IGNORE キーワードは、固有のキー値上に既存行を複製する
インプット行の扱いをコントロールします。

REPLACE を指定すると、インプット行は既存行を置き換えます。
言い換えると、主キーや固有インデックスに対して同じ値を持つ、既存行であるという事です。

IGNORE を指定すると、 固有キー値上の、既存行を複製するインプット行はスキップされます。
もしどちらのオプションも指定しなければ、その動作は LOCAL キーワードが指定されたかどうかによって
決まります。LOCAL を利用すると、複製キー値が見つかった時点でエラーが発生し、テキスト ファイル
の残りは無視されます。LOCAL を使用しなければ、デフォルトの動作は IGNORE が指定された時と
同じです。これは、サーバは操作の最中にファイルの送信を中止する事ができないからです。

もしロード操作中に外部キー制約を無視したければ、LOAD DATA を実行する前に
SET FOREIGN_KEY_CHECKS=0 ステートメントを発行する事ができます。

(例)
以下のテーブルにPKを作成後にREPLACEオプションを使用してデータをロードしてみます。

テーブルの状態
load_replace

テキストファイルの中身
text

mysql> LOAD DATA INFILE '/tmp/MYSQLIMP.txt' REPLACE INTO TABLE MYSQLIMP;
Query OK, 8 rows affected (0.00 sec)
Records: 4 Deleted: 4 Skipped: 0 Warnings: 0

メモ
①テキストファイルから4ラインが読み込まれた
②4件のデータが削除されて4件の新しいデータがファイルから読み込まれた。(PKあり)
③全体で、8行のデータが処理された(Query OK, 8 rows affected (0.00 sec))

REPLACE は、もしテーブル内の古い行が PRIMARY KEY か UNIQUE インデックスの
新しい行と同じ値を持っていれば、古い行は新しい行が挿入される前に削除されるという事以外、
INSERT と全く同じように機能します。

結果
load_data_infile_replace

参考サイト
LOAD DATA INFILE 構文
12.2.6. REPLACE 構文
LOAD DATA INFILE構文でデータのインポート!


LOAD DATA INFILEの他にMYSQLIMPORTプログラムを利用する事によって
データをIMPORTする事が出来ます。
mysqlimportクライアントはLOAD DATA INFILESQLステートメントにコマンドラインインターフェース
を提供します。 mysqlimportに対する殆どのオプションはLOAD DATA INFILE構文の節に直接対応
しています

mysqlimport_11

shell> mysqlimport [options] db_name textfile1 [textfile2 …]

コマンドラインで名づけられた各テキストファイルごとに、mysqlimportはファイルネームの
拡張を取り除き、結果をファイルの内容をインポートするテーブルの名前を決定します。
例えば、patient.txt、patient.text、そしてpatientと名づけられたファイルは全てpatientと
名づけられたファイルにインポートされます。

[root@colinux bin]# ./mysqlimport
./mysqlimport Ver 3.7 Distrib 5.1.39, for pc-linux-gnu (i686)
Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Loads tables from text files in various formats. The base name of the
text file must be the name of the table that should be used.
If one uses sockets to connect to the MySQL server, the server will open and
read the text file directly. In other cases the client will open the text
file. The SQL command ‘LOAD DATA INFILE’ is used to import the rows.

Usage: ./mysqlimport [OPTIONS] database textfile…
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
The following groups are read: mysqlimport client
The following options may be given as the first argument:
–print-defaults Print the program argument list and exit
–no-defaults Don’t read default options from any options file
–defaults-file=# Only read default options from the given file #
–defaults-extra-file=# Read this file after the global files are read
–character-sets-dir=name
Directory where character sets are.
–default-character-set=name
Set the default character set.
-c, –columns=name Use only these columns to import the data to. Give the
column names in a comma separated list. This is same as
giving columns to LOAD DATA INFILE.
-C, –compress Use compression in server/client protocol.
-#, –debug[=name] Output debug log. Often this is ‘d:t:o,filename’.
–debug-check Check memory and open file usage at exit.
–debug-info Print some debug info at exit.
-d, –delete First delete all rows from table.
–fields-terminated-by=name
Fields in the textfile are terminated by …
–fields-enclosed-by=name
Fields in the importfile are enclosed by …
–fields-optionally-enclosed-by=name
Fields in the i.file are opt. enclosed by …
–fields-escaped-by=name
Fields in the i.file are escaped by …
-f, –force Continue even if we get an sql-error.
-?, –help Displays this help and exits.
-h, –host=name Connect to host.
-i, –ignore If duplicate unique key was found, keep old row.
–ignore-lines=# Ignore first n lines of data infile.
–lines-terminated-by=name
Lines in the i.file are terminated by …
-L, –local Read all files through the client.
-l, –lock-tables Lock all tables for write (this disables threads).
–low-priority Use LOW_PRIORITY when updating the table.
-p, –password[=name]
Password to use when connecting to server. If password is
not given it’s asked from the tty.
-P, –port=# Port number to use for connection or 0 for default to, in
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/services, built-in default (3306).
–protocol=name The protocol of connection (tcp,socket,pipe,memory).
-r, –replace If duplicate unique key was found, replace old row.
-s, –silent Be more silent.
-S, –socket=name Socket file to use for connection.
–use-threads=# Load files in parallel. The argument is the number of
threads to use for loading data.
-u, –user=name User for login if not current user.
-v, –verbose Print info about the various stages.
-V, –version Output version information and exit.

Variables (–variable-name=value)
and boolean options {FALSE|TRUE} Value (after reading options)
——————————— —————————–
character-sets-dir (No default value)
default-character-set utf8
columns (No default value)
compress FALSE
debug-check FALSE
debug-info FALSE
delete FALSE
fields-terminated-by (No default value)
fields-enclosed-by (No default value)
fields-optionally-enclosed-by (No default value)
fields-escaped-by (No default value)
force FALSE
host (No default value)
ignore FALSE
ignore-lines 0
lines-terminated-by (No default value)
local FALSE
lock-tables FALSE
low-priority FALSE
port 3306
replace FALSE
silent FALSE
socket /tmp/mysql.sock
use-threads 0
user (No default value)
verbose FALSE
[root@colinux bin]#

[root@colinux bin]# mysql -e 'CREATE TABLE MYSQLIMP(id INT,n varchar(30))' STUDY -u root -p
Enter password:
[root@colinux bin]# ed
a
100 This is MYSQLIMPORT
101 STUDY AT HOME
102 HAVE A FUN
103 I WISH I CAN SLEEP..
.
w MYSQLIMP.txt
82
q
[root@colinux bin]# od MYSQLIMP.txt
0000000 030061 004460 064124 071551 064440 020163 054515 050523
0000020 044514 050115 051117 005124 030061 004461 052123 042125
0000040 020131 052101 044040 046517 005105 030061 004462 040510
0000060 042526 040440 043040 047125 030412 031460 044411 053440
0000100 051511 020110 020111 040503 020116 046123 042505 027120
0000120 005056
0000122
[root@colinux bin]# od -c MYSQLIMP.txt
0000000 1 0 0 \t T h i s i s M Y S Q
0000020 L I M P O R T \n 1 0 1 \t S T U D
0000040 Y A T H O M E \n 1 0 2 \t H A
0000060 V E A F U N \n 1 0 3 \t I W
0000100 I S H I C A N S L E E P .
0000120 . \n
0000122
[root@colinux bin]# mysqlimport --local STUDY MYSQLIMP.txt -u root -p
Enter password:
STUDY.MYSQLIMP: Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
[root@colinux bin]# mysql -e 'select * from MYSQLIMP' STUDY -u root -p
Enter password:
+——+———————-+
| id | n |
+——+———————-+
| 100 | This is MYSQLIMPORT |
| 101 | STUDY AT HOME |
| 102 | HAVE A FUN |
| 103 | I WISH I CAN SLEEP.. |
+——+———————-+
[root@colinux bin]#

ed_command

※ edコマンド 「aから.まで」で、wでファイルに書き込みqでquit
編集しているときは、文字と文字はタブでスペースを空けてます。

参考サイト
7.14. mysqlimport — データインポートプログラム

MYSQLIMPORT



CREATE TABLE `LOAD_DATA` (
`ID` int(11) DEFAULT NULL,
`FLAG` char(1) DEFAULT NULL,
`SDATE` timestamp NULL DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

imp_exp

以下のようにNULLと記入されているファイルをLOADすると以下のようになる。
[root@colinux tmp]# cat load.txt
NULL NULL NULL
[root@colinux tmp]#


LOAD DATA INFILE '/tmp/load.txt' INTO TABLE LOAD_DATA LINES TERMINATED BY '\r\n';

テキストの中身が「NULL NULL NULL」の場合
load_data_2

テキストの中身が「\N \N \N」の場合
null1
http://variable.jp/?p=344