導入
ここまでは1文ずつ実行してきました。でも実務では、「テーブルを作って初期データを入れる」といった一連の SQL を1つのファイルにまとめて保存し、何度でも実行できるようにします。この拡張子 .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);
依存関係の順番に注意。 orders は customers を参照するので、削除は「子(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 の中身をまるごとコピーして下のエディタに貼り付け、実行してみましょう。複数の文が順に処理され、customers と orders が新しく作られます。そのあと 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, '青');