INSERT 文でデータを追加する
INSERT 文でデータを追加する とは
SQLのINSERT文を使ったテーブルへのデータ追加方法を、実際にSQLを操作しながら実践的に習得します。
なぜ重要か
テーブルを作っただけでは何の役にも立ちません。注文が入った、ユーザが登録した、在庫が増えた、というイベントが発生するたびに行を追加する命令が INSERT です。Web アプリで「会員登録」「投稿」「カート追加」を実装するなら、裏側では必ず INSERT が走っています。型を考えて作ったテーブルに、要件通りの値を流し込めることが「データを扱える」の第一歩です。INSERT を理解しないまま SELECT 演習だけ繰り返しても、本物のアプリは作れません。
基本構文
INSERT には大きく 2 つの書き方があります。
SQL クエリ
-- 1. 列名を明示するパターン (推奨)
INSERT INTO users (id, name, email, age)
VALUES (1, '田中太郎', 'tanaka@example.com', 28);
-- 2. 列名を省略するパターン (テーブル定義の全列を順番に書く)
INSERT INTO users
VALUES (2, '佐藤花子', 'sato@example.com', 32);本番のコードでは必ず列名を書きます。後から列を追加した時に 2 番目の書き方は静かに壊れるからです。
一度に複数行を入れる
SQL クエリ
INSERT INTO products (id, name, price) VALUES
(1, 'コーヒー豆 200g', 1200),
(2, 'ドリッパー', 2800),
(3, '電動ミル', 9800);ループで 1 行ずつ INSERT を投げるよりも、まとめて書いた方がネットワーク往復が減って何倍も速くなります。シードデータの投入では定番の書き方です。
処理の流れ
INSERT は「制約に違反する行は最初から入れない」という挙動なので、設計時に NOT NULL や UNIQUE を入れておくと、アプリのバグでゴミが入ることを未然に防げます。
一部の列だけ指定する
列を省略すると DEFAULT 値か NULL が入ります。
SQL クエリ
CREATE TABLE messages (
id INT PRIMARY KEY,
body TEXT NOT NULL,
is_read INT NOT NULL DEFAULT 0
);
-- is_read を省略するとデフォルトの 0 が入る
INSERT INTO messages (id, body) VALUES (1, 'はじめまして');SELECT の結果をそのまま入れる
他のテーブルから移し替えるときは INSERT ... SELECT が便利です。
SQL クエリ
INSERT INTO archived_users (id, name)
SELECT id, name FROM users WHERE is_active = 0;バッチ処理やバックアップで「条件付きで別テーブルにコピーする」というユースケースは頻出です。INSERT INTO ... SELECT を使うと、アプリ側でループする必要がなくなり SQL 一発で済みます。
重複時の挙動を制御する
MySQL/TiDB には主キーや UNIQUE 違反を起こした行をスキップしたり、上書きしたりするための拡張構文があります。
SQL クエリ
-- 同じ主キーがあれば無視 (失敗にしない)
INSERT INTO users (id, name, email)
VALUES (1, '田中', 'tanaka@example.com');
-- 同じ主キーがあれば指定列を更新する (upsert)
INSERT INTO users (id, name, email)
VALUES (1, '田中', 'tanaka@example.com')
ON CONFLICT (id) DO UPDATE
SET name = EXCLUDED.name;本番では ON CONFLICT DO NOTHING の乱用は禁物で、「なぜ無視するのか」をコメントで残すことが大切です。
本番の INSERT は必ず「列名を明示」「複数行は VALUES を改行で並べる」「コード経由ならプレースホルダで SQL インジェクションを防ぐ」の 3 つを守ると安全です。プレースホルダは
?や$1のような書き方で、ユーザ入力をそのまま文字列連結しないためのテクニックです。
アプリのテストや CI で大量のシードデータを入れる時は、複数行 INSERT を使うとレスポンスが何倍も速くなります。
INSERT INTO t VALUES (...), (...), (...)の形は実務では必修です。
注意 VALUES の中の値は型に合わせる必要があります。数値列に
'123'のように引用符付きで渡しても多くの場合は通りますが、文字→数値の暗黙変換が走るので、コードレビューでは指摘対象です。
まとめ
- INSERT は列名を明示するのが基本
- 複数行を一括 INSERT するとパフォーマンスが向上する
- 省略した列には DEFAULT または NULL が入る
- INSERT ... SELECT で他テーブルからコピーできる
- 制約に違反する行は最初から入らない
- ON CONFLICT で「あれば更新、なければ追加」 (upsert) ができる
次のレッスン
次は UPDATE 文でデータを更新する です。UPDATE文を使って、データベースのデータを更新する操作を学習します。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- INSERT の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. INSERT とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
テーブル構造
schema.sql
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price INT NOT NULL,
stock INT NOT NULL DEFAULT 0
);期待される出力
| id | name | price | stock |
|---|---|---|---|
| 2 | ワイヤレスマウス | 3500 | 50 |
| 3 | 外付けSSD 1TB | 14800 | 20 |
| 1 | ノートPC | 120000 | 10 |