\ ポイント最大11倍! /

【SQL】INSERT でデータベースにレコードを挿入しよう!

  • SQL の INSERT 文の基本を理解したい!

このような方に向けて書きました。

SELECTに続いて重要なクエリが今回ご紹介するINSERTです。

INSERTはテーブルにデータを追加するクエリになります。

具体例を挙げながら丁寧に解説していきます。

INSERT の基本

テーブルに新しい行を挿入するのがINSERTです。

基本構文は以下の通り。

INSERT INTO テーブル名 (列1, 列2, ...)
VALUES (値1, 値2, ...);
効果
INSERT INTO挿入先のテーブルを指定
テーブル名テーブル名を指定
列名リスト挿入する列名
省略する場合、全列に値を提供する
VALUES挿入するデータの値を指定
各句の説明

特定の列にデータを挿入

以下はemployeesというテーブルに新しいレコードを追加するためのクエリです。

INSERT INTO employees (name, age, department)
VALUES ('John Doe', 30, 'Sales');

INSERT INTO employeesとすることで、データ追加先のテーブルを定義しています。

続いて(name, age, department)としているので、name, age, departmentの3つのカラムにデータが入ります。

最後に実際に挿入する値をVALUES ('John Doe', 30, 'Sales')と指定します。

上記を実行することで、employeesテーブルに、以下の新しい従業員が追加されます。

このクエリを実行すると、employeesテーブルに次のような新しいレコードが追加されます:

nameagedepartment
John Doe30Sales
挿入されたレコード

すべての列にデータを挿入

以下のクエリもemployeesテーブルに新しいレコードを追加するクエリです。

ただし、先ほどのクエリとは違ってカラムの指定がありません。そのため、全てのカラムに対して値を挿入します。

INSERT INTO employees
VALUES (1, 'John Doe', 30, 'Sales');

INSERT INTO employeesでは、employeesテーブルにデータを挿入することを宣言しています。

続いて実際に挿入する値をVALUES (1, 'John Doe', 30, 'Sales')として指定。この場合には、指定された順番でテーブルの全カラムに対して値が挿入されます。

ここでは、列の並びが以下であると仮定します。

  • id
  • name
  • age
  • department

クエリ実行により追加されるレコードは以下になります。

idnameagedepartment
1John Doe30Sales
追加されたレコード

ただし、今回の方法では順番だけを頼りにデータをINSERTしていますから、列の並びが違う場合には予期した通りの並びにならない点には注意です。

安全のため、ちゃんとカラム名も指定するのがおすすめです。

一つの INSERT 文で複数行を挿入

値の部分には、複数のペアを指定することができます。

INSERT INTO employees (name, age, department)
VALUES ('John Doe', 30, 'Sales'), 
       ('Jane Smith', 25, 'Marketing'), 
       ('Sam Brown', 35, 'IT');

構造としては一行ずつ追加していくクエリと同様ですが、追加する値をタプル()で囲う部分が異なります。

クエリ実行により、以下のレコードが順次追加されていきます。

idnameagedepartment
1John Doe30Sales
追加されたレコード – 1
idnameagedepartment
2Jane Smith25Marketing
追加されたレコード – 2
idnameagedepartment
3Sam Brown35IT
追加されたレコード – 3

この方法は一つのINSERTクエリを実行するので、INSERTを3回実行するよりもパフォーマンスが向上します。

さらに効率的な挿入を行う方法もあります。
PostgreSQLではCOPYコマンドを、MySQLではLOAD DATA INFILEを使う方法があります。

別のテーブルからデータを選択して挿入

別テーブルからデータを持ってきて、対象のテーブルに挿入します。

INSERT INTO employees (name, age, department)
SELECT name, age, 'New Department'
FROM old_employees
WHERE department = 'Old Department';

つまり、この場合には以下の処理を行なっています。

  • old_employeesテーブルから特定の条件に一致するレコードを選択
  • 取得したレコードをemployeesテーブルに挿入

まずINSERT INTO employees (name, age, department)を説明します。

これは最終的に挿入する「先」のテーブルを定義しています。つまり、employeesテーブルにデータを挿入します。
それと同時に、挿入するデータのカラムをタプルで指定しています。ここではnameagedepartmentを指定しました。

続いて、SELECT name, age, 'New Department' FROM old_employeesについてです。

これはold_employeesというテーブルのnameage列をそのまま選択して、departmentカラムには固定値として'New Department'を一律で入れています。

最後にWHERE department = 'Old Department'について解説します。

ここではdepartmentカラムの値が'Old Department'であるレコードが対象になります。

例えばold_employeesテーブルが以下だったとします。

nameagedepartment
John Doe30Old Department
Jane Smith25Marketing
Sam Brown35Old Department
元々のテーブル

クエリ実行後は、以下の状態になります。

nameagedepartment
John Doe30New Department
Sam Brown35New Department
クエリ実行後のテーブル

このプロセスは「サブクエリ」だったりINSERT...SELECTと呼ばれます。

INSERT を扱う際の注意点

INSERTはデータを挿入するという操作上、少し気をつけることがあります。

ざっと理解を進めておきましょう。

データ型の扱い

INSERT文では、列と値の型が一致しないとエラーが発生します。

たとえば、列の型が「整数型」なのに「文字列」を挿入するのは NG です。

INSERT INTO employees (name, age)
VALUES ('John Doe', 'thirty'); -- エラー:age列は整数型

AUTO_INCREMENT 列について

employeesテーブルの定義が以下だったとします。

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255),
    age INT,
    department VARCHAR(255)
);

このように定義されたテーブルに対して、以下のINSERT文を実行すると、idカラムは自動的にインクリメントされます。

INSERT INTO employees (name, age, department)
VALUES ('John Doe', 30, 'Sales');

例えばこのクエリを実行する前にemployeesテーブルにレコードがない場合には、以下の結果になります・。

idnameagedepartment
1John Doe30Sales
1度目のINSERTを行った結果

さらにレコードを追加します。

INSERT INTO employees (name, age, department)
VALUES ('Jane Smith', 25, 'Marketing');

テーブルの内容は次のようになります:

idnameagedepartment
1John Doe30Sales
2Jane Smith25Marketing
2度目のINSERTを行った結果

エラーハンドリング

データベースによっては、挿入時にエラーが発生した場合の処理を制御するオプションが提供されています。

例えば、MySQLではINSERT IGNOREON DUPLICATE KEY UPDATEなどがそれに当たります。

-- 重複エラーを無視する
INSERT IGNORE INTO employees (id, name, age, department)
VALUES (1, 'John Doe', 30, 'Sales');

-- 重複した場合は更新する
INSERT INTO employees (id, name, age, department)
VALUES (1, 'John Doe', 30, 'Sales')
ON DUPLICATE KEY UPDATE age = 30, department = 'Sales';

まとめ:INSERT文を使いこなしてデータの挿入をマスターしよう!

以上で、基本的なINSERT文の解説は以上です。

SELECT文に比べるとバリエーションは少ないので、ごく短期間でマスターできるはずです。

ぜひ本記事を参考に、SQL 操作のスキルを上げていってください。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

karo@プログラマのアバター karo@プログラマ プログラマ

「書くことで人の役にたつ」をモットーに活動中。
本職はプログラマで、Python(Django)が得意。最近ではフロント側の技術に触れる機会も増えてきました。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)