データベースにデータを追加する際に必ず使うのが、INSERT
文です。
MySQLを使った開発や運用では、ユーザー情報や商品データなど、さまざまなデータをデータベースに追加する場面が日常的にあります。
この記事では、MySQLのINSERT
文について、基本的な文法から、複数行の追加方法、条件付き挿入、エラー対策など、実務で役立つテクニックまでを丁寧に解説します。
初心者の方でもわかりやすいように、実例を交えながら解説しますので、ぜひ参考にしてください。
INSERT文の基本構文
INSERT
文の基本構文は以下の通りです。
INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...);
例として、users
というテーブルに名前とメールアドレスを追加する場合は以下のようになります。
INSERT INTO users (name, email) VALUES ('山田太郎', 'taro@example.com');
カラム名を省略して全カラムに値を指定することも可能ですが、カラムの順番を完全に一致させる必要があるため注意が必要です。
INSERT INTO users VALUES (1, '山田太郎', 'taro@example.com');
複数行を一度にINSERTする方法
データの挿入が複数行ある場合、1行ずつ実行するのは効率が悪くなります。
そのようなときは、以下のように複数のレコードを一括で挿入できます。
INSERT INTO users (name, email) VALUES
('佐藤花子', 'hanako@example.com'),
('鈴木次郎', 'jiro@example.com'),
('田中三郎', 'saburo@example.com');
これにより、クエリの回数を減らすことができ、パフォーマンスも向上します。
NULLの扱い方と省略可能なカラム
テーブルによっては、特定のカラムがNULL
(未入力可)を許容している場合があります。
その場合、省略したりNULL
を明示的に指定することができます。
INSERT INTO users (name) VALUES ('高橋陽子');
もしくは
INSERT INTO users (name, email) VALUES ('高橋陽子', NULL);
省略したカラムには、デフォルト値やNULL
が代入されます。
テーブル定義(CREATE TABLE
)時に設定された制約を確認しておきましょう。
INSERT文とAUTO_INCREMENTの関係
よくあるケースとして、IDカラムに自動連番(AUTO_INCREMENT
)が使われていることがあります。
この場合、IDカラムの値は明示的に指定しなくても問題ありません。
INSERT INTO users (name, email) VALUES ('井上悟', 'satoru@example.com');
IDは自動的に次の番号が付与されます。
ただし、明示的にIDを指定して挿入することも可能です(重複しないよう注意)。
INSERT IGNORE:重複時にエラーを無視
データ挿入時に重複エラーを回避したい場合、INSERT IGNORE
を使うと便利です。
INSERT IGNORE INTO users (email) VALUES ('duplicate@example.com');
この構文を使うと、もしemail
にユニーク制約があり、すでに存在するメールアドレスを挿入しようとした場合でも、エラーにならずに無視されます。
ON DUPLICATE KEY UPDATE:重複したら更新する
INSERT
文には、重複時にデータを更新する構文もあります。
特定のユニークキー(例:メールアドレス)に重複が発生した場合、該当レコードを更新するという処理が可能です。
INSERT INTO users (email, name) VALUES ('taro@example.com', '山田太郎')
ON DUPLICATE KEY UPDATE name = VALUES(name);
この方法は、存在しなければ新規挿入、存在すれば更新という処理を1回のクエリで行えるため、非常に効率的です。
サブクエリを使ったINSERT
他のテーブルからデータを取得して挿入するには、サブクエリを使用します。
INSERT INTO archived_users (id, name, email)
SELECT id, name, email FROM users WHERE deleted = 1;
このようにすれば、条件に合致するデータを一括で別テーブルに移すことができます。
INSERT文でよくあるエラーと対処法
データ型の不一致
ERROR 1366 (HY000): Incorrect integer value: 'abc' for column 'id'
対処法:指定する値が、定義されたデータ型に合っているか確認しましょう。
NOT NULL制約違反
ERROR 1048 (23000): Column 'email' cannot be null
対処法:NOT NULL
指定されたカラムに値がない場合、エラーになります。事前にスキーマを確認して、必須項目を入力しましょう。
ユニークキーの重複
ERROR 1062 (23000): Duplicate entry 'taro@example.com' for key 'email'
対処法:INSERT IGNORE
やON DUPLICATE KEY UPDATE
を活用して重複対策を行うと安全です。
トランザクションとINSERT文
複数のINSERT
文をまとめて処理したい場合は、トランザクションを活用することで整合性を保つことができます。
START TRANSACTION;
INSERT INTO orders (...) VALUES (...);
INSERT INTO order_items (...) VALUES (...);
COMMIT;
途中でエラーが出た場合はROLLBACK;
で元に戻すこともできます。
これによりデータの一貫性が保証されます。
おわりに
INSERT
文はMySQLで最も基本的かつ重要な文のひとつです。
本記事で紹介した基本構文から応用テクニックまでを理解しておくことで、実務や開発において柔軟かつ正確なデータ追加が可能になります。
特に、ON DUPLICATE KEY UPDATE
やINSERT IGNORE
は、効率的でエラーに強い設計をするうえで欠かせない構文です。
ぜひこの記事を参考に、日々の業務や学習に活かしてみてください。