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文について学びましょう!