新しいデータをデータベースに追加したい時、必ず使うのが「INSERT(インサート)文」です。しかし、「構文がよくわからない」「複数行はどう書くの?」と悩む初心者も多いのではないでしょうか。
この記事では、SQLのINSERT文の基本構文から実用的な応用例まで、やさしく丁寧に解説します。
INSERT文ってなに?

INSERT文の役割
INSERT
文は、データベースのテーブルに新しいデータ(レコード)を追加するためのSQL文です。
データの「登録」操作にあたります。
基本的な書き方
INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...);
実際の使用例
-- usersテーブルに新しいユーザーを追加
INSERT INTO users (name, email) VALUES ('山田太郎', 'taro@example.com');
構文の意味
- INSERT INTO:「〜に挿入する」という意味
- テーブル名:データを追加したいテーブルの名前
- (カラム1, カラム2):値を入れたい列の名前
- VALUES:「値は」という意味
- (値1, 値2):実際に入れたいデータ
ポイント
- カラム名と値の順番を合わせる
- 文字列は「’」(シングルクォート)で囲む
- 数値は「’」で囲まない
構文の流れを理解すれば、単一行の追加は簡単です。次は、複数行を一度に追加する方法を紹介します。
複数行を一括でINSERTしよう

複数行挿入の方法
複数のレコードを一括で挿入したい場合、VALUES
句をカンマで区切って並べます。
実際の使用例
-- 3人のユーザーを一度に追加
INSERT INTO users (name, email) VALUES
('佐藤花子', 'hana@example.com'),
('鈴木次郎', 'jiro@example.com'),
('田中美咲', 'misaki@example.com');
一括挿入のメリット
- 実行が速い:1回ずつ実行するより効率的
- エラー処理が簡単:全部成功か全部失敗で管理しやすい
- ネットワーク負荷が軽い:通信回数が減る
注意点
- 1行でもエラーがあると、全部の挿入が失敗する
- あまり大量(数千行以上)だと、メモリ不足になる可能性がある
ポイント
- 各行の値をカッコで囲む
- 行と行の間はカンマで区切る
- 最後の行の後にはカンマを付けない
大量データの登録では、一括INSERTが効率的です。
次は、すべてのカラムを指定しない場合の注意点を見ていきましょう。
省略できるカラムとDEFAULT値の使い方

省略可能なカラムについて
テーブルには、以下のようなカラムがあります。
- NULL を許可するカラム:値を入れなくてもOK
- DEFAULT値が設定されているカラム:自動的に初期値が入る
- AUTO_INCREMENT(自動連番):自動的に番号が割り振られる
これらのカラムは省略することができます。
実際の使用例
-- emailカラムを省略(NULLまたはDEFAULT値が自動設定)
INSERT INTO users (name) VALUES ('田中一郎');
-- idカラムを省略(AUTO_INCREMENTで自動採番)
INSERT INTO products (name, price) VALUES ('ノートパソコン', 89800);
テーブル構造の確認方法
-- テーブルの構造を確認
DESCRIBE users;
結果例:
Field | Type | Null | Key | Default | Extra
------|--------------|------|-----|---------|-------
id | int(11) | NO | PRI | NULL | auto_increment
name | varchar(100) | NO | | NULL |
email | varchar(100) | YES | | NULL |
ポイント
- 省略するカラムがある場合は、事前にテーブル設計を確認
- 必須カラム(NOT NULL かつ DEFAULT なし)は必ず指定
- AUTO_INCREMENTのカラムは通常省略する
省略するカラムがある場合は、事前にテーブル設計を確認しておきましょう。次は、INSERTとSELECTの組み合わせについて解説します。
他のテーブルからデータをコピーしよう
INSERT INTO … SELECT の使い方
別のテーブルからデータを取得して挿入するには、SELECT
文と組み合わせることができます。
基本的な書き方
INSERT INTO コピー先テーブル (カラム1, カラム2)
SELECT カラム1, カラム2 FROM コピー元テーブル WHERE 条件;
実際の使用例
-- 退会ユーザーをアーカイブテーブルにコピー
INSERT INTO archive_users (name, email, quit_date)
SELECT name, email, NOW() FROM users WHERE status = 'inactive';
-- 今月の売上データを月次集計テーブルにコピー
INSERT INTO monthly_sales (product_id, total_sales)
SELECT product_id, SUM(amount) FROM daily_sales
WHERE sale_date >= '2024-06-01'
GROUP BY product_id;
このパターンの活用場面
- データのバックアップ:重要なデータを別テーブルに保存
- 履歴管理:過去のデータを履歴テーブルに移動
- 集計データの作成:日次データから月次データを作成
- テストデータの作成:本番データからテスト用データを作成
ポイント
- SELECTで取得する列の順番と、INSERTする列の順番を合わせる
- データ型も一致させる必要がある
- WHERE句で必要なデータだけを選択する
データ移行や複製に便利なこの手法は、実務で非常によく使われます。最後に、よくあるエラーとその対処法を紹介します。
INSERT文でよくあるエラーと対策

よくあるエラーパターン
エラー1:カラム数と値の数が合わない
-- ❌ 間違い:カラムは2つなのに値は1つだけ
INSERT INTO users (name, email) VALUES ('田中太郎');
-- ✅ 正しい:カラム数と値の数を合わせる
INSERT INTO users (name, email) VALUES ('田中太郎', 'tanaka@example.com');
エラー2:必須カラムに値を入れていない
-- ❌ 間違い:nameは必須なのに省略している
INSERT INTO users (email) VALUES ('test@example.com');
-- ✅ 正しい:必須カラムも含める
INSERT INTO users (name, email) VALUES ('テストユーザー', 'test@example.com');
エラー3:重複エラー(PRIMARY KEYやUNIQUE制約)
-- ❌ エラーになる場合:既にid=1のデータがある
INSERT INTO users (id, name) VALUES (1, '重複太郎');
-- ✅ 対策1:AUTO_INCREMENTを使う(idを省略)
INSERT INTO users (name) VALUES ('重複太郎');
-- ✅ 対策2:重複時の処理を指定(MySQL)
INSERT INTO users (id, name) VALUES (1, '重複太郎')
ON DUPLICATE KEY UPDATE name = '更新太郎';
エラーを防ぐコツ
事前確認をしっかり行う
-- テーブル構造を確認
DESCRIBE users;
-- 既存データを確認
SELECT * FROM users LIMIT 5;
-- カラムの制約を確認
SHOW CREATE TABLE users;
少数のデータでテストする
-- まず1行だけでテスト
INSERT INTO users (name, email) VALUES ('テスト太郎', 'test@example.com');
-- 問題なければ複数行を実行
ポイント
- INSERT前の準備とデータ確認が重要
- エラーメッセージをよく読んで原因を特定
- 本番環境では必ずテストしてから実行
エラーを防ぐには、INSERT前の準備とデータ確認が不可欠です。
まとめ
INSERT文は、データベースに情報を追加するための基本的かつ重要なSQL文です。
覚えるべきポイント
- 基本構文:
INSERT INTO テーブル名 (カラム名) VALUES (値)
- 複数行挿入:VALUES句をカンマで区切って並べる
- カラムの省略:NULL許可やDEFAULT値があるカラムは省略可能
- SELECT との組み合わせ:他テーブルからデータをコピー
コメント