MySQLに大きなcsvをいれるまで



カラム100列で100万行以上あるcsv or tsvデータを，データベースにしようとおもうと，SQLiteだとデータがデカすぎてインポートに何時間もかかるのではないでしょうか？(さらにそれが，10,20ファイルもあると嘆かわしい・・・)
そこで，MySQLを用いてそれらのデータを簡単にインポートしてあげましょう．

# MySQLのインストール
## Win党

Windowsの人はこちらを参照してもらえるとよいかと．
https://www.dbonline.jp/mysql/install/
MySQL Workbench(MySQLのGUIです)も一緒にダウンロードしてください．

(以下，mac環境での解説です．Windowsの人も自分の環境にうまく当てはまるようにして，実行してみてください．)

## mac党
macerは

```
$ brew install mysql
```

でOK!
Homebrewについて，知らない方は以下を参照．
https://brew.sh/index_ja

ちなみに，workbenchはbrew-caskから．
つまり

```
$ brew cask install mysqlworkbench
```

で，行けます．



# コマンドライン(terminal)で，MySQLを起動させてみよう！
Terminal(コマンドライン)を起動し

```
$ mysql.server start
```
でMySQLサーバーが起動(尚，これだけではコマンドから指示は出せない)．

ところが僕は最初にこれをやった時，ERRORが出ちゃいました．

```
$ mysql.server start
Starting MySQL
..............................................................ERROR! The server quit without updating PID file (/usr/local/var/mysql/(略).pid).
```
こいつが出てもMySQL使えることはあるのですが，ちゃんと直したい．大抵僕の場合

```
$ ps ax | grep mysql

(略)

$ kill -9 プロセスID
#このプロセスidではgrep mysqlとは関係のないものを入力し，プロセスを強制終了させる．
```
(参考:https://qiita.com/maimaimai5420w/items/2748b70d888aa29340c6)

で，`.. SUCCESS! `と出てくるようになります．

そして，コマンドラインに以下のように入力すると，起動するはずです．

```
$ mysql -u root
#設定，環境によっては"mysql","mysql -u root  -p"などもあり得る．

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.16 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

#　テーブルを作ろう
今回は以下のようなデータを，テーブルにしようと思います．

|名前	|数学	|英語	|国語	|志望校|
|:------------:| ------------:| ------------:| ------------:| ------------:|
|佐藤||50|70|A大|
|鈴木||90|87|A大|
|高橋|67|85|76|B大|
|田中|49|25|30||
|伊藤|41|30||E大|
|渡辺|89|60|80|C大|

このデータはタブ区切りのcsvとします．

テーブルの作成は，Workbenchが便利(だと思う．）なので，Workbenchを使っていきましょう．
起動してやり，Local instanceのSQLサーバーに接続します（大抵，インストールの際にローカルServerへのコネクションの設定が一つは作られているはずですが，なかったら作ってあげてください）．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223577/46227ad0-4857-a651-6b7c-612694ff9c59.png)
これの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223577/37764764-b991-933a-4346-875721a619c5.png)
を選択し，新しいSchemaを作成．

左側のバーのSchemaを選択，Tableを右クリックして，crearetableしてあげてください．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223577/57c9baab-20bf-8c8f-d783-aaf595624a96.png)
そして，上のように設定しApplyを押します．(PKは重複がある場合は押さないでください)


これで，データベース内にTableが完成しました．

# コマンドラインでMySQLを操作し，csvファイルを取り込む

csvファイルはMySQL Workbenchからももちろん取り込めますが，あまり早くありません．
そこで，今回はコマンドラインから,MySQlを立ち上げてcsvファイルを取り込むことにします．

先述のようにMySQLを立ち上げましょう．そして，csvファイルを読み込みます．

```
mysql> use (作ったテーブルのschemaを入力)

mysql> LOAD DATA LOCAL INFILE '(csvが存在するディレクトリのパス)/seito.csv' INTO TABLE seito 

mysql> FIELDS TERMINATED BY '\t' 
#カンマ区切りの場合は','

mysql> OPTIONALLY ENCLOSED BY '"'

mysql> LINES TERMINATED BY '\n';
#Windowsの場合ですと，'\r\n'かも

```

でインポートできるかと．
できない場合は以下をご覧ください．

### The used command is not allowed with this MySQL version" が出る場合
(参考)https://yoku0825.blogspot.com/2018/07/mysql-80load-data-local-infile-error.html

`$ mysql -u root`を`$ mysql --local-infile=1 -u root`にすると良いという情報もあるみたいですが，僕の場合できませんでした．