1. INSERT文とは?

INSERT文は、データベースのテーブルに新しいデータを追加するために使用します。INSERTにも様々な使い方がありますが、今回も実務で使用頻度の高いものに絞ってレクチャーします。


2. 1行ずつデータを挿入する

1行ずつデータのINSERTはデータベース操作の基本であり、特にPHPなどのプログラム内で頻繁に使用されます。ほとんどのアプリケーションでは、新しいデータを追加するたびにこの方法が活用されるため、最も一般的であり、広く実践されている手法です。

基本構文

INSERT INTO テーブル名 (カラム1, カラム2, ...)
VALUES (値1, 値2, ...);

例: usersテーブルに1件のデータを追加

INSERT INTO users (name, email, age)
VALUES ('田中 太郎', 'tanaka@example.com', 30);

INSERTの応用

3.1 ON DUPLICATE KEY UPDATE(MySQL)

INSERT … ON DUPLICATE KEY UPDATEは、主キーまたは一意キーが同じデータがすでに存在する場合に、該当するレコードを更新できる構文です。

存在しない場合は新規にINSERTされ、存在する場合はUPDATEされる動作を行います。

INSERT INTO users (id, name, email, age)
VALUES (1, '田中 一郎', 'tanaka@example.com', 40)
ON DUPLICATE KEY UPDATE name = '田中 一郎', age = 40;

INSERTとUPDATEは分けて書くべき?

PHPなどのロジックで、 INSERTUPDATEを明確に処理分けして記述するプログラマもいれば、 ON DUPLICATE KEY UPDATEを用いるプログラマもいます。

ロジックでINSERTとUPDATEを明確に処理分けた方が、処理内容が明確になり可読性が高まるため推奨される場合もあります。しかし、 上書きの意味合いが強い場合や、処理を簡潔に記述したい場合には、ON DUPLICATE KEY UPDATE を用いることが有効です。

3.2 INSERT IGNORE(MySQL)

INSERT IGNOREは、データを追加するときに、 すでに同じデータがある場合でもエラーを発生させずに処理を続けるための方法です。

例えば、 idemail主キー(PRIMARY KEY)や一意制約(UNIQUE)が設定されていると、同じ値のデータを追加しようとしたときにエラーになります。 しかし、 INSERT IGNOREを使うと、 そのレコードを無視して処理を続けることができます。

これは、バッチ処理(大量のデータを一度に処理する場合)などで、 途中でエラーが発生しても処理を止めたくない場合に役立ちます。

INSERT IGNORE INTO users (id, name, email, age) VALUES (1, '田中 一郎', 'tanaka@example.com', 40);

4. オートインクリメントされたIDを取得する

データベースの idカラムを オートインクリメント(自動で連番を振る仕組み) にしている場合、データを新しく登録すると、その idが自動的に決まります。

実務では、新しくデータを登録したあと、そのデータの idを知りたい場面 がよくあります。 例えば、登録したユーザーの idを取得し、そのまま別の処理で使いたい場合などです。

データベースの種類によって idの取得方法が異なるので、よく使うデータベースの方法を覚えておくと便利です。

以下の方法で、idカラムがオートインクリメントになっている場合、 INSERT実行後に自動生成されたIDを取得することができます。

MySQL / MariaDB

INSERT INTO users (name, email, age) VALUES ('佐藤 健', 'sato@example.com', 29);
SELECT LAST_INSERT_ID();

PostgreSQL

INSERT INTO users (name, email, age) VALUES ('佐藤 健', 'sato@example.com', 29) RETURNING id;

SQLite

INSERT INTO users (name, email, age) VALUES ('佐藤 健', 'sato@example.com', 29);
SELECT last_insert_rowid();

この方法を使用することで、新しく追加されたレコードの idを取得し、後続の処理に活用できます。


5. 一括で複数行のデータを挿入する

一括で複数行のデータを挿入する方法は、プログラム内で直接埋め込まれて実行されることは少ないです。エラーハンドリングの難しさ(不備のデータでエラーが起きた場合、どこの行でエラーがおきたか分からない)がその要因の一つです。 しかし、大量のデータを一括でインポート・エクスポートする際には非常に有用であり、手動でデータを管理する場面では頻繁に使用されます。

複数のデータを一度に追加する場合は、 VALUESの後にカンマで区切ってデータを記述します。

例: usersテーブルに複数のデータを一括挿入

INSERT INTO users (name, email, age)
VALUES
    ('佐藤 花子', 'sato@example.com', 25),
    ('鈴木 次郎', 'suzuki@example.com', 28),
    ('高橋 三郎', 'takahashi@example.com', 35);

メリット:

デメリット:


6. バックアップで活用:SELECTと組み合わせてデータを挿入する

システム開発においてデータのバックアップはとても大切な作業です。データを誤って削除したり、壊れたりしても元に戻せるためです。 INSERTとSELECTの組み合わせの構文はバックアップやデータコピーするときによく使われる方法です。別のテーブルからデータを取得して新しいテーブルに挿入する場合、 INSERT INTO ... SELECTを使用します。

見本テーブル

usersテーブル

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100),
    age INT
);

users_backupテーブル

CREATE TABLE users_backup (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100),
    age INT
);

例: users_backupテーブルに usersのデータをコピー

INSERT INTO users_backup (id, name, email, age)
SELECT id, name, email, age FROM users;

この方法は、バックアップやテーブル間のデータ移動に便利です。

注意点:

例: ageが30以上のユーザーのみバックアップ

INSERT INTO users_backup (id, name, email, age)
SELECT id, name, email, age FROM users WHERE age >= 30;

7. まとめ

次のステップ: UPDATE文について学びましょう!