本文へスキップ
BecomeCoder

SQL テーブル設計 (DDL)コース · 第7章 実務へ · レッスン22

.sql ファイル ― スクリプトにまとめる

ブラウザで完結

導入

ここまでは1文ずつ実行してきました。でも実務では、「テーブルを作って初期データを入れる」といった一連の SQL1つのファイルにまとめて保存し、何度でも実行できるようにします。この拡張子 .sql のファイルを SQL スクリプト と呼びます。

説明

.sql ファイルは、ただのテキストファイルです。中に SQL 文を上から順に並べ、それぞれを ; で区切ります。実行すると、上から1文ずつ順番に処理されます。人間向けのメモ(実行時は無視される)コメントも書けます。

-- ハイフン2つ: そこから行末までが1行コメント
/* スラッシュとアスタリスク: 複数行にわたるコメント */

.sql ファイルの典型的な構成は、「スキーマ(テーブル定義)」→「シード(初期データ)」の順です。作り直しても失敗しないよう、先頭で DROP TABLE IF EXISTS を書いてから CREATE TABLE するのが定番です。

flowchart LR
  D["① DROP IF EXISTS<br/>作り直しの衝突を防ぐ"] --> C["② CREATE TABLE<br/>スキーマ(入れ物)を定義"]
  C --> I["③ INSERT<br/>シード(初期データ)を投入"]
-- ===== schema.sql : お店のデータベース =====

-- 1. 既存のテーブルがあれば消す(子 → 親 の順)
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS customers;

-- 2. テーブルを定義する(親 → 子 の順)
CREATE TABLE customers (
  id   INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  city TEXT
);

CREATE TABLE orders (
  id       INTEGER PRIMARY KEY,
  cust_id  INTEGER NOT NULL,
  product  TEXT NOT NULL,
  amount   INTEGER NOT NULL,
  FOREIGN KEY (cust_id) REFERENCES customers(id)
);

-- 3. 初期データ(シード)を入れる(親 → 子 の順)
INSERT INTO customers (id, name, city) VALUES
  (1, '佐藤', '東京'),
  (2, '鈴木', '大阪');

INSERT INTO orders (id, cust_id, product, amount) VALUES
  (1, 1, 'キーボード', 3200),
  (2, 2, 'モニター', 24800);

依存関係の順番に注意。 orderscustomers を参照するので、削除は「子(orders)→ 親(customers)」、作成と投入は「親 → 子」の順にします。逆にすると、参照先が無い状態になってエラーになることがあります。

このファイルはどう実行するの? ふだんは各 DB のツールに読み込ませます。SQLite なら sqlite3 shop.db < schema.sql、MySQL なら mysql -u ユーザ名 -p DB名 < schema.sql、PostgreSQL なら psql -f schema.sql。いずれも「ファイルを丸ごと流し込む」形です。GUI ツール(DBeaver など)なら .sql を開いて「実行」でも動きます。

やってみよう

上の schema.sql の中身をまるごとコピーして下のエディタに貼り付け、実行してみましょう。複数の文が順に処理され、customersorders が新しく作られます。そのあと SELECT * FROM customers; で中身を確認してください。これが「.sql ファイルを実行する」ということです。

演習

colors というテーブルを作り、初期データを2件入れる、小さな .sql スクリプトを書いて実行してください。列は id(整数・主キー)と name文字列)。先頭に DROP TABLE IF EXISTS colors; も入れましょう。

ヒント1を見る

「DROP IF EXISTS → CREATE TABLE → INSERT」の順に、それぞれ ; で区切って並べます。

ヒント2を見る

DROP TABLE IF EXISTS colors; CREATE TABLE colors (id INTEGER PRIMARY KEY, name TEXT); INSERT INTO colors (id, name) VALUES (1, '赤'), (2, '青');

実際に動かしてみよう

下のエディタにクエリを書いて「実行」を押すと、ブラウザ内のSQLiteで結果が表示されます。本文の例をそのまま試したり、書き換えたりしてみましょう。

SQL — ブラウザ内で実行(SQLite)

ブラウザ内でSQLを動かす環境(SQLite)を読み込みます(初回のみ一瞬)。
スクロールして表示された時点でも自動で読み込まれます。