【MySQL】SQLファイルを実行する方法【3種類】
https://style.potepan.com/articles/25532.html
SQLファイルを実行する方法として3種類をご紹介していきます。
事前準備
今回サンプルで実行するSQLファイルには、「test.sql」というファイル名で、下記のSQL文を記述しています。
12 | SELECT *FROM user; |
「test.sql」は「/Users/ユーザー名/Documents/sql」フォルダ内に格納しています。
userテーブルには下記のデータを用意しておきました。
1234567 | +—-+—————–+——+| id | name | age |+—-+—————–+——+| 1 | 山田太郎 | 30 || 2 | 山田花子 | 25 || 3 | 鈴木じろう | 20 |+—-+—————–+——+ |
さいごにMySQLを下記のコマンドで立ち上げておきましょう。
1 | sudo mysql.server start; |
SQLファイル実行
1: sourceコマンド
実行方法の1つ目は、MySQLにログインした状態で利用します。
MySQLのログインには下記のコマンドが利用可能です。
1 | mysql -u root -p |
設定したパスワードを入力してログインしてください。
ログインが完了して下記の画面になっていれば、準備完了です。
ここから実際にSQLファイル実行に移る訳ですが、基本的な構文は下記となります。
1 | source ファイル名(ファイルパス); |
ファイル名の部分には具体的なファイルパスを指定して実行します。
1 | source /Users/ユーザー名/Documents/sql/test.sql; |
下記の画像のようにSQL文の結果が取得出来ていることをご確認頂けます。
SQLファイル実行
2: \.コマンド
2つ目の実行方法に関しても、MySQLにログインした状態で実施します。
ポテパンダの一言メモ
MySQLへのログイン方法は、1つ目の実行方法で紹介した手順を参照してください。
まずは基本的な構文からご紹介します。
1 | \. ファイル名(ファイルパス) |
1つ目の実行方法の「source」コマンドが「\.」コマンドに変更されただけですね。実行コマンドの末尾に「;」を入力するとエラーとなるため、注意が必要です。
では実際に実行してみましょう。
1 | \. /Users/ユーザー名/Documents/sql/test.sql |
実行した結果は下記の画像のように全く同じ結果が表示されていることをご確認頂けます。
SQLファイル実行
3: mysqlコマンド
3つ目の方法では、MySQLにログインする前のターミナルコマンドの状態で、SQLのファイル実行までを一括で実施してしまう方法です。
ただし、今回ご紹介する方法を実行する場合、SQLファイルに利用するデータベースを指定する「USE」コマンドを記述しておく必要があることには注意してください。
サンプルのSQLファイルの場合、下記のように修正します。
1234 | USE データベース名; SELECT *FROM user; |
ポテパンダの一言メモ
上記の方法を試していた方は、一度「exit」コマンドでMySQLをログアウトしておいてください。
基本的な構文は下記となります。
1 | mysql -u root -p < ファイル名(ファイルパス) |
サンプルの場合、下記のようになりますね。
1 | mysql -u root -p < /Users/ユーザー名/Documents/sql/test.sql |
パスワードの入力を求められますので、MySQLに設定したログイン用のパスワードを入力しましょう。
SQLファイルを実行した結果が表示されていることをご確認頂けます。
SQLファイルの実行:応用編(複数SQLの一括実行)
ここまでで、SQLファイルの実行方法について確認してもらいました。
お気づきの方もいらっしゃるかも知れませんが、SQLファイル内部には1つのSQL文しか記述出来ないという訳ではありません。
複数のSQL文を記述した場合、1つのファイルを実行するだけで、上から順番にファイル末尾までSQL文をまとめて実行することも可能です。
サンプル
今回は下記のようなサンプルSQLファイルを作成してみました。
上述したuserテーブルのバックアップ用テーブル「user_bk」を作成し、全てのデータをコピーした後にバックアップテーブルのデータを確認するSQL文を1つのファイルにまとめています。
test.sql
123456789101112131415 | USE test_db; CREATE TABLE user_bk( id int, name varchar(50), age int, bk_date date); INSERT INTO user_bk(id, name, age, bk_date)SELECT id, name, age, now()FROM user; SELECT *FROM user_bk; |
今回は3つ目に紹介したコマンドで実行してみましょう。
1 | mysql -u root -p < /Users/ユーザー名/Documents/sql/test.sql |
実行した結果、下記の画像のようにuser_bkテーブルからuserテーブルに存在したデータのバックアップが取得出来ていることをご確認頂けます。
さいごに:SQLファイルを活用して開発効率を上げよう
本記事では、SQLファイルの実行方法について、Mac環境でMySQLを利用する際のコマンドをご紹介してきました。
実務では何度も利用するSQL文を、SQLファイルとして保存する方法は一般的です。
これまで、SQLファイルを開いてSQL文をコピペしていたという方も、今回ご紹介したように簡単なコマンドで実行可能ですので、ぜひ使い方を覚えて開発効率を上げるための手法としてご活用ください。
mysqlコマンドでDBに入ってから実行する方法
MySQLでファイルからSQLを実行する
https://qiita.com/IysKG213/items/994e9f4ad12ff8aee322
MySQLで大量のテーブルを作るに当たって、Oracleみたいにテキストファイルを渡して処理を実行できないかなぁと思って調べたら、やはり同じ様な方法は存在したので、メモ。
コマンドライン上でファイルに記載したSQLを実行
$ mysql 「DB名」 < 「対象ファイル」
※対象ファイルの中で`use 「DB名」`を実行している場合は「DB名」を省略可能
実施例
[mysql8@vmora112 ~]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.13 MySQL Community Server - GPL
Copyright (c) 2000, 2018, 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> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
mysql> exit
Bye
[mysql8@vmora112 ~]$
[mysql8@vmora112 ~]$ cat create_user.ddl ★実行するコマンドの中身★
CREATE USER 'iwate'@'%' identified by 'Mysql_8!';
GRANT ALL PRIVILEGES ON *.* TO 'iwate'@'%' WITH GRANT OPTION;
[mysql8@vmora112 ~]$
[mysql8@vmora112 ~]$ mysql -uroot -p < create_user.ddl ★スクリプトファイルを渡して実行★
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 8.0.13 MySQL Community Server - GPL
Copyright (c) 2000, 2018, 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>
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| iwate | % | ★作成したユーザーが存在★
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
MySQLに接続した状態で実行
> source 「対象ファイル」
もしくは
> \. 「対象ファイル」
sourceコマンド実施例
[mysql8@vmora112 ~]$ cat createDB.ddl ★実行するコマンド★
create database test;
[mysql8@vmora112 ~]$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 8.0.13 MySQL Community Server - GPL
Copyright (c) 2000, 2018, 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>
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> source createDB.ddl ★sourceコマンドでスクリプトファイルを実行★
Query OK, 1 row affected (0.11 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test | ★作成したDBが存在★
+--------------------+
5 rows in set (0.00 sec)
\. 方式実施例
[mysql8@vmora112 ~]$
[mysql8@vmora112 ~]$ cat create_table_juve.ddl ★実行するコマンド★
CREATE TABLE juve(
id_no numeric(6) NOT NULL COMMENT 'ID',
no VARCHAR(5) NOT NULL COMMENT '背番号',
fir_name VARCHAR(25) NULL COMMENT '名前',
fam_name VARCHAR(25) NULL COMMENT '姓',
position VARCHAR(3) NOT NULL COMMENT 'ポジション',
PRIMARY KEY (id_no)
)COMMENT 'ユベントス';
[mysql8@vmora112 ~]$
[mysql8@vmora112 ~]$ mysql -uiwate -p test
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 8.0.13 MySQL Community Server - GPL
Copyright (c) 2000, 2018, 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> show tables;
Empty set (0.00 sec) ★テーブルは存在しない★
mysql>
mysql> \. create_table_juve.ddl ★「\.」でスクリプトファイルを実行★
Query OK, 0 rows affected (0.08 sec)
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| juve | ★テーブルが作成されている★
+----------------+
1 row in set (0.00 sec)
showコマンドを実行するときにoracleのクセでsho ○○
と打ってエラーに出しちゃう人って結構いそうな気がする・・・。
少なくとも自分は結構な頻度でやってしまう(笑)。