INSERT
| 対応: | SQL-92(1992) |
|---|
テーブルに新しい行を追加する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 IGNORE | MySQLの拡張構文です。主キー重複などのエラーが発生しても処理を継続します。 |
サンプルコード
以下の『employees』テーブルを例に説明します(挿入前の状態)。
社員テーブルに1件挿入します。
sample_insert.sql
INSERT INTO employees (name, department, salary, hire_date)
VALUES ('征陸智己', '執行官', 290000, '2024-04-01');
Query OK, 1 row affected (0.01 sec)
挿入結果を確認します。
sample_insert.sql
SELECT * FROM employees WHERE name = '征陸智己' ORDER BY id DESC LIMIT 1;
+----+----------+------------+--------+------------+ | id | name | department | salary | hire_date | +----+----------+------------+--------+------------+ | 4 | 征陸智己 | 執行官 | 290000 | 2024-04-01 | +----+----------+------------+--------+------------+ 1 row in set
複数件を一括挿入します。
sample_insert.sql
INSERT INTO employees (name, department, salary, hire_date)
VALUES
('唐之杜志恩', '分析官', 310000, '2024-04-01'),
('狡噛慎也', '執行官', 300000, '2024-04-01'),
('常守朱', '監視官', 280000, '2024-04-01');
Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0
挿入結果を確認します。3件が追加されています。
sample_insert.sql
SELECT * FROM employees ORDER BY id;
+----+------------+------------+--------+------------+ | id | name | department | salary | hire_date | +----+------------+------------+--------+------------+ | 1 | 狡噛慎也 | 執行官 | 300000 | 2023-04-01 | | 2 | 常守朱 | 監視官 | 280000 | 2023-04-01 | | 3 | 宜野座伸元 | 監視官 | 320000 | 2023-04-01 | | 4 | 征陸智己 | 執行官 | 290000 | 2024-04-01 | | 5 | 唐之杜志恩 | 分析官 | 310000 | 2024-04-01 | | 6 | 狡噛慎也 | 執行官 | 300000 | 2024-04-01 | | 7 | 常守朱 | 監視官 | 280000 | 2024-04-01 | +----+------------+------------+--------+------------+ 7 rows in set
列名を省略する場合はすべての列に値を指定します(列の順序に合わせます)。id に NULL を指定すると、AUTO_INCREMENT により自動で番号が割り当てられます。
sample_insert.sql
INSERT INTO employees VALUES (NULL, '宜野座伸元', '監視官', 320000, '2024-04-01');
Query OK, 1 row affected (0.01 sec)
挿入結果を確認します。
sample_insert.sql
SELECT * FROM employees WHERE id = 8;
+----+------------+------------+--------+------------+ | id | name | department | salary | hire_date | +----+------------+------------+--------+------------+ | 8 | 宜野座伸元 | 監視官 | 320000 | 2024-04-01 | +----+------------+------------+--------+------------+ 1 row in set
在職中の社員と同じ部署名・給与で新しい社員を挿入します(SELECT の結果を INSERT に利用する例)。
sample_insert.sql
INSERT INTO employees (name, department, salary, hire_date) SELECT '唐之杜志恩', department, salary, '2024-04-01' FROM employees WHERE name = '宜野座伸元' LIMIT 1;
Query OK, 1 row affected (0.01 sec) Records: 1 Duplicates: 0 Warnings: 0
挿入結果を確認します。宜野座伸元と同じ部署・給与で挿入されています。
sample_insert.sql
SELECT * FROM employees WHERE id = 9;
+----+------------+------------+--------+------------+ | id | name | department | salary | hire_date | +----+------------+------------+--------+------------+ | 9 | 唐之杜志恩 | 監視官 | 320000 | 2024-04-01 | +----+------------+------------+--------+------------+ 1 row in set
データベース別の書き方
『INSERT INTO ... VALUES』の基本構文と複数行挿入は主要なデータベースで共通して使用できます。
INSERT INTO employees (name, department, salary, hire_date)
VALUES
('征陸智己', '執行官', 290000, '2024-04-01'),
('唐之杜志恩', '分析官', 310000, '2024-04-01');
自動連番の仕組みはデータベースによって異なります。MySQL は『AUTO_INCREMENT』、PostgreSQL は『SERIAL』または『GENERATED AS 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, ...);
挿入後に自動採番されたIDを取得する方法も異なります。MySQL は『LAST_INSERT_ID()』、PostgreSQL は『RETURNING』句を使用します。
-- MySQL
SELECT LAST_INSERT_ID();
-- PostgreSQL(INSERT文に直接記述できます)
INSERT INTO employees (name) VALUES ('狡噛慎也') RETURNING id;
概要
『INSERT INTO』はテーブルへの新規データ追加に使用します。列名を明示的に記述することで、テーブルの列順序に依存しない安全な挿入ができます。また、将来的に列が追加された場合にも影響を受けにくくなります。
AUTO_INCREMENTが設定された主キー列は省略するか『NULL』を指定すると、自動的に連番が割り当てられます。挿入後に割り当てられた主キー値を取得するにはMySQLでは『LAST_INSERT_ID()』関数を使用します。
アプリケーションからINSERTを実行する際は、必ずプリペアドステートメントを使用してください。文字列をそのままSQL文に埋め込むとSQLインジェクション攻撃の危険があります。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。