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 を投げるよりも、まとめて書いた方がネットワーク往復が減って何倍も速くなります。シードデータの投入では定番の書き方です。

処理の流れ

diagram (will load when visible)

INSERT は「制約に違反する行は最初から入れない」という挙動なので、設計時に NOT NULLUNIQUE を入れておくと、アプリのバグでゴミが入ることを未然に防げます。

一部の列だけ指定する

列を省略すると 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 つができることを確認しましょう。

  1. INSERT の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (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 );

期待される出力

idnamepricestock
2ワイヤレスマウス350050
3外付けSSD 1TB1480020
1ノートPC12000010

ヒント

query.sql
query.sql
学習モード
コードの実行結果
データベースを初期化中...