SQLのINSERT文を完全マスター!基本構文と実用例をわかりやすく解説

データベース・SQL

新しいデータをデータベースに追加したい時、必ず使うのが「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 との組み合わせ:他テーブルからデータをコピー

コメント

タイトルとURLをコピーしました