INSERT
文は、データベースのテーブルに新しいデータを追加するために使用します。INSERTにも様々な使い方がありますが、今回も実務で使用頻度の高いものに絞ってレクチャーします。
1行ずつデータのINSERTはデータベース操作の基本であり、特にPHPなどのプログラム内で頻繁に使用されます。ほとんどのアプリケーションでは、新しいデータを追加するたびにこの方法が活用されるため、最も一般的であり、広く実践されている手法です。
INSERT INTO テーブル名 (カラム1, カラム2, ...)
VALUES (値1, 値2, ...);
users
テーブルに1件のデータを追加
INSERT INTO users (name, email, age)
VALUES ('田中 太郎', 'tanaka@example.com', 30);
INSERT
の応用
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;
PHPなどのロジックで、 INSERTと UPDATEを明確に処理分けして記述するプログラマもいれば、 ON DUPLICATE KEY UPDATEを用いるプログラマもいます。
ロジックでINSERTとUPDATEを明確に処理分けた方が、処理内容が明確になり可読性が高まるため推奨される場合もあります。しかし、 上書きの意味合いが強い場合や、処理を簡潔に記述したい場合には、ON DUPLICATE KEY UPDATE を用いることが有効です。
INSERT IGNORE
(MySQL)
INSERT IGNORE
は、データを追加するときに、
すでに同じデータがある場合でもエラーを発生させずに処理を続けるための方法です。
例えば、
id
や
email
に
主キー(PRIMARY KEY)や一意制約(UNIQUE)が設定されていると、同じ値のデータを追加しようとしたときにエラーになります。 しかし、
INSERT IGNORE
を使うと、
そのレコードを無視して処理を続けることができます。
これは、バッチ処理(大量のデータを一度に処理する場合)などで、 途中でエラーが発生しても処理を止めたくない場合に役立ちます。
INSERT IGNORE INTO users (id, name, email, age) VALUES (1, '田中 一郎', 'tanaka@example.com', 40);
データベースの
id
カラムを オートインクリメント(自動で連番を振る仕組み) にしている場合、データを新しく登録すると、その
id
が自動的に決まります。
実務では、新しくデータを登録したあと、そのデータの
id
を知りたい場面 がよくあります。 例えば、登録したユーザーの
id
を取得し、そのまま別の処理で使いたい場合などです。
データベースの種類によって
id
の取得方法が異なるので、よく使うデータベースの方法を覚えておくと便利です。
以下の方法で、id
カラムがオートインクリメントになっている場合、
INSERT
実行後に自動生成されたIDを取得することができます。
INSERT INTO users (name, email, age) VALUES ('佐藤 健', 'sato@example.com', 29);
SELECT LAST_INSERT_ID();
INSERT INTO users (name, email, age) VALUES ('佐藤 健', 'sato@example.com', 29) RETURNING id;
INSERT INTO users (name, email, age) VALUES ('佐藤 健', 'sato@example.com', 29);
SELECT last_insert_rowid();
この方法を使用することで、新しく追加されたレコードの
id
を取得し、後続の処理に活用できます。
一括で複数行のデータを挿入する方法は、プログラム内で直接埋め込まれて実行されることは少ないです。エラーハンドリングの難しさ(不備のデータでエラーが起きた場合、どこの行でエラーがおきたか分からない)がその要因の一つです。 しかし、大量のデータを一括でインポート・エクスポートする際には非常に有用であり、手動でデータを管理する場面では頻繁に使用されます。
複数のデータを一度に追加する場合は、
VALUES
の後にカンマで区切ってデータを記述します。
users
テーブルに複数のデータを一括挿入
INSERT INTO users (name, email, age)
VALUES
('佐藤 花子', 'sato@example.com', 25),
('鈴木 次郎', 'suzuki@example.com', 28),
('高橋 三郎', 'takahashi@example.com', 35);
メリット:
デメリット:
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;
この方法は、バックアップやテーブル間のデータ移動に便利です。
注意点:
users_backup
のカラム構造が
users
と一致している必要があります。
WHERE
句を加えることで特定の条件のデータのみコピー可能です。
age
が30以上のユーザーのみバックアップ
INSERT INTO users_backup (id, name, email, age)
SELECT id, name, email, age FROM users WHERE age >= 30;
INSERT
文はデータベースにデータを追加するために使用する。
SELECT
と組み合わせることでデータのバックアップやコピーが可能。
ON DUPLICATE KEY UPDATE
や
INSERT IGNORE
などの応用テクニックも存在する。
LAST_INSERT_ID()
や
RETURNING
を用いて取得できる。
次のステップ:
UPDATE
文について学びましょう!