大前提
どのRDBでもTSV・CSVからのインポートは何かと面倒くさいので、TSVをインサートSQLに変換するスクリプトを自作しておいてSQLでインポートすることをお勧めする。 ただし、同じインポートを何回も行うことになり、かつデータが大量の場合は、調べる手間をかけても出来合いのツールで設定を組んでおくメリットがある。
基本
mysqlimport -u ユーザー名 --password=パスワード --local データベース名 テーブル名.txt
設定ファイル
~/.my.cnfにオプションを書いておけばmysqlimportコマンドを実行するときに省略できる。
my.cnf
[mysqlimport]
user=ユーザー名
password=パスワード
default-character-set=utf8
local
mysqlimport データベース名 テーブル名.txt
以降の説明では~/.my.cnfに書かれていることを前提にする。
インポートするファイル
- インポートするファイルの名前は
テーブル名.txt
になっていること - タブ区切り(TSV)になっていること(区切り文字の変更方法は後述)
例:
use d1;
CREATE TABLE t1 (
id int(11) primary key auto_increment,
name varchar(250)
);
t1.txt
NULL あいうえお
NULL かきくけこ
NULL さしすせそ
既存レコードはそのままにレコードを追加する場合
mysqlimport データベース名 テーブル名.txt
既存レコードを削除してからインポートする場合
mysqlimport -d データベース名 テーブル名.txt
制約を無視してインポートするには
primary keyやuniqueの制約を無視してインポートするには
(重複する行がある場合、既にある行が削除される)
mysqlimport -r データベース名 テーブル名.txt
CSVファイルをインポートするには
フィールド区切り文字を変更するには--fields-terminated-by=
を使う。
他に
--fields-enclosed-by=...
, --fields-optionally-enclosed-by=...
, --fields-escaped-by=...
というオプションがある。
auto_incrementなidをつけるのが面倒な場合
NULL
と書いておけば自動的に採番される。
そうでなく固定で番号をつけておきたいときはvimで
%!cat -n
または
%!nl
idを1でない値から始めたい場合は(下記は50から)
%!nl -v 50
または
%!ruby -ne 'print ($. + 50).to_s + "\t" + $_'