全力で怠けたい

怠けるために全力を尽くしたいブログ。

MySQL で SQL を記述した外部ファイルから実行する方法。

MySQL というか mysql コマンドで SQL を記述した外部ファイルから実行する方法をメモしておく。

mysql コマンドのバージョン。5.7 とか 5.6 でも同じやり方が使える。

$ mysql --version
mysql  Ver 8.0.27 for Linux on x86_64 (MySQL Community Server - GPL)

動作を確認する用の適当なテーブルとデータを作っておく。 あと認証にかかわるオプション -u とかは記載は省略していく。

mysql> create database mydb;
Query OK, 1 row affected (0.01 sec)

mysql> use mydb;
Database changed

mysql> create table my_table(id int);
Query OK, 0 rows affected (0.04 sec)

mysql> insert into my_table values(1);
Query OK, 1 row affected (0.02 sec)

SQL を記述した外部ファイルから実行する方法

SQL を記述したファイルを mysql コマンドの標準入力にリダイレクトする

mysql コマンドは SQL ステートメントを標準入力から読み込んで実行するので、SQL を記述したファイルを mysql コマンドの標準入力にリダイレクトする。

$ cat select.sql
use mydb;
select * from my_table;

$ mysql -t < select.sql
+------+
| id   |
+------+
|    1 |
+------+

SQL を記述したファイルをパイプで mysql コマンドの標準入力に接続する

mysql コマンドは SQL ステートメントを標準入力から読み込んで実行するので、SQL を記述したファイルをパイプで mysql コマンドの標準入力に接続する。 自分がネットワーク越しに巨大な SQL ファイルを取得して実行するとかはだいたいこれ。

$ cat select.sql | mysql -t
+------+
| id   |
+------+
|    1 |
+------+

source コマンドでSQL を記述したファイルを読み込む

mysql コマンドの対話モードで source コマンドを実行すると外部ファイルを読み込んで実行する。

$ cat select.sql
use mydb;
select * from my_table;

$ pwd
/home/bob

$ mysql

mysql> source /home/bob/select.sql
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

source コマンドは相対パスを指定してもちゃんとファイルを読み込んでくれる。

mysql> source ./select.sql
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

さらに source コマンドは ~ をホームディレクトリのパスに展開してくれるのでこんな感じにも使える。

mysql> source ~/select.sql
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

あと source コマンドは \. でも実行できる。source とタイプするのがだるいときは \. とタイプすると4文字分を省略できる。

mysql> \. ~/select.sql
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

参考サイト