早速ですが、1万件のレコードをSQLに入れてみよう!
@大量のレコードをRDSのテーブルに挿入する
INSERT INTO ……
を1万行も書けるかー!
とうことで、大量のレコードを簡単にテーブルに挿入する方法を探しました。
SQLの「LOAD DATA INFILE」が早そうです。
=======================================
● 構文
LOAD DATA INFILE "ファイル名" INTO TABLE テーブル名
FIELDS TERMINATED BY ',区切り文字' ENCLOSED BY '"';
● SQL
LOAD DATA LOCAL INFILE '[ファイル名].csv' ← EC2の ~/ に置いた
REPLACE INTO TABLE [テーブル名]
CHARACTER SET utf8 ← CSVファイルの中身もUTF-8で!
FIELDS TERMINATED BY ',' ← カンマ( , )区切りです
OPTIONALLY ENCLOSED BY '"'; ← 文字をテーブルに保存するときはダブルクォート( " )でお願いします
=======================================
【参考】
・大規模CSVをMySQLに入れる
・LOAD DATA INFILE構文:データのインポート
・[MySQL] CSV を使ってエクスポート・インポート
これを知らず、始めは INSERT文をコンソールにコピペしてましたが、手作業なので遅いし正確性が心配なので
止めてよかったです。
と思ったところで、「さて、どうやってCSVファイルをEC2にアップロードしよう」という新たな疑問が生じました。
AEC2にSSHやFileZillaを使ってファイルをアップロードする
●コンソール画面からファイルをアップする ※SCPコマンドを使用
参考サイトを元に、EC2用に書き変えました↓
$ scp -P 22 -i [証明書] [CSVファイル] ec2-user@xx.xx.xx.xx:/home/ec2-user/
xxxxxxx.csv 100% 65KB 65.3KB/s 00:00 ←これが表示されれば成功
【参考】ssh でファイル転送(SCP コマンド)
FTPソフト「FileZilla」を使うこともできます。
●設定
ホスト:ec2-user@xx.xx.xx.xx の「xx.xx.xx.xx」部分
ポート:空でOK
Protocol:SFTP
ログオンの種類:パスワードを訪ねる
ユーザー:ec2-user ※SSHでログインするときのユーザー
パスワード:空でOK
アカウント:空でOK
参考サイトにもありますが、SSHでログインするときに使っている秘密鍵を使用します。
※そのままでは使用できないため、変換する旨のアラートが表示されるのでOKを押します
メニュー > FileZilla > Preference の画面

【参考】【aws】ec2にfilezilla経由でファイルアップロード
これで無事CSVファイルの中身をRDSのテーブルに挿入することができました。
BちょっとしたSQLの話
よく使うSQLをズラズラと。
●テーブル作成
CREATE TABLE [テーブル名] (
[カラム名] [型] [NOT NULL等のオプション],
[インデックス名](インデックスを付与するカラム名),
) DEFAULT CHARSET=utf8; ← 文字コードはUTF-8
●テーブル名変更
ALTER TABLE [旧テーブル名] RENAME TO [新テーブル名];
●カラム追加
ALTER TABLE [テーブル名] ADD [カラム名] [型] [NOT NULL等のオプション];
●カラムの型変更
ALTER TABLE [テーブル名] CHANGE COLUMN [旧カラム名] [新カラム名] [変えたい型] [NOT NULL等のオプション];
※新旧のカラム名は同じ
●インデックス確認
SHOW INDEX FROM [テーブル名];
●複合インデックスの付与 ※条件で組み合わせて使うカラムがあるときに有効
CREATE INDEX [インデックス名] ON [テーブル名]([カラム1], [カラム2]);
●インデックス削除
ALTER TABLE [テーブル名] DROP INDEX [削除したいインデックス];
●SELECT文の結果をテーブルに挿入
INSERT INTO [テーブル名] ([カラム1], [カラム2], ....)
SELECT [カラム1], [カラム2], ...
FROM [テーブル名];
●特定の小数点以下を切り捨て ※123.4567 → 123.45
SELECT TRUNCATE([カラム名], 2) FROM [テーブル名];
【参考】
・CREATE TABLE構文
・MySQL 編13 - 数値関数、余り、四捨五入、切り捨て、切り上げ、数値書式
・SELECT結果をINSERT/UPDATE
準備が整ったので、今度こそアプリづくりに着手できる……はず!