Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

INSERT

テーブルに新しい行を追加するSQL文です。1件ずつの挿入だけでなく、複数行の一括挿入や別テーブルからのデータコピーにも対応しています。

構文
-- 1行挿入します。列名と値を対応させて記述します。
INSERT INTO テーブル名 (列名1, 列名2, ...) VALUES (値1, 値2, ...);

-- 複数行を一度に挿入します。
INSERT INTO テーブル名 (列名1, 列名2) VALUES (値1, 値2), (値3, 値4), ...;

-- SELECT の結果を挿入します。
INSERT INTO テーブル名 (列名1, 列名2) SELECT 列名1, 列名2 FROM 別テーブル名;
構文一覧
構文概要
INSERT INTO テーブル名 (...) VALUES (...)指定した列に値を挿入します。列名を省略するとすべての列に値を指定する必要があります。
VALUES (...), (...)複数行を一度に挿入します。1件ずつのINSERTより高速です。
INSERT INTO ... SELECT ...SELECTの結果をそのまま挿入します。テーブル間のデータコピーに使用します。
INSERT IGNOREMySQLの拡張構文です。主キー重複などのエラーが発生しても処理を継続します。
サンプルコード
-- 社員テーブルに1件挿入します。
INSERT INTO employees (name, department, salary, hire_date)
VALUES ('田中太郎', '開発部', 300000, '2024-04-01');

-- 複数件を一括挿入します。
INSERT INTO employees (name, department, salary, hire_date)
VALUES
    ('鈴木花子', '営業部', 280000, '2024-04-01'),
    ('佐藤一郎', '総務部', 320000, '2024-04-01'),
    ('山田次郎', '開発部', 350000, '2024-04-01');

-- 列名を省略する場合はすべての列に値を指定します(列の順序に合わせます)。
INSERT INTO employees VALUES (NULL, '高橋美咲', '営業部', 260000, '2024-04-01', NULL);

-- 別テーブルのデータをコピーします。
INSERT INTO employees_archive (name, department, salary)
SELECT name, department, salary FROM employees WHERE retire_date IS NOT NULL;
実行結果
-- INSERT 実行後、挿入された行数が返されます。
-- 例: 3行挿入した場合
-- Query OK, 3 rows affected (0.01 sec)
-- Records: 3  Duplicates: 0  Warnings: 0
データベース別の書き方

『INSERT INTO ... VALUES』の基本構文と複数行挿入は主要なデータベースで共通して使用できます。

INSERT INTO employees (name, department, salary, hire_date)
VALUES
    ('鈴木花子', '営業部', 280000, '2024-04-01'),
    ('佐藤一郎', '総務部', 320000, '2024-04-01');

自動連番の仕組みはデータベースによって異なります。MySQL は『AUTO_INCREMENT』、PostgreSQL は『SERIAL』または『GENERATED AS IDENTITY』、Oracle は『シーケンス』、SQL Server は『IDENTITY』、SQLite は『INTEGER PRIMARY KEY』を使用します。

-- MySQL
CREATE TABLE employees (id INT NOT NULL AUTO_INCREMENT, ...);

-- PostgreSQL
CREATE TABLE employees (id SERIAL PRIMARY KEY, ...);
-- または(SQL標準構文)
CREATE TABLE employees (id INT GENERATED ALWAYS AS IDENTITY, ...);

-- SQL Server
CREATE TABLE employees (id INT IDENTITY(1,1) NOT NULL, ...);

挿入後に自動採番されたIDを取得する方法も異なります。MySQL は『LAST_INSERT_ID()』、PostgreSQL は『RETURNING』句、SQL Server は『SCOPE_IDENTITY()』、Oracle は『RETURNING INTO』を使用します。

-- MySQL
SELECT LAST_INSERT_ID();

-- PostgreSQL(INSERT文に直接記述できます)
INSERT INTO employees (name) VALUES ('田中太郎') RETURNING id;

-- SQL Server
SELECT SCOPE_IDENTITY();
概要

『INSERT INTO』はテーブルへの新規データ追加に使用します。列名を明示的に記述することで、テーブルの列順序に依存しない安全な挿入ができます。また、将来的に列が追加された場合にも影響を受けにくくなります。

AUTO_INCREMENTが設定された主キー列は省略するか『NULL』を指定すると、自動的に連番が割り当てられます。挿入後に割り当てられた主キー値を取得するにはMySQLでは『LAST_INSERT_ID()』関数を使用します。

アプリケーションからINSERTを実行する際は、必ずプリペアドステートメントを使用してください。文字列をそのままSQL文に埋め込むとSQLインジェクション攻撃の危険があります。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。