Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

インサート(INSERT)とは?

インサートとは、テーブルに新しいデータを追加する命令です。

どのDBMSでも利用する命令文なので、覚えておくのは必須と言えます。

ここでは、INSERT文の基本的な使い方から、さまざまな条件に合わせた方法まで解説します。

インサートの使い方

さっそく、インサートの使い方をサンプルを通して見ていきましょう。

INSERT文の使い方は次の通りです。

INSERT INTO テーブル名 (列名1, 列名2, 列名3…) VALUES (値1, 値2, 値3…);

INSERT文は、INSERTの後ろにINTOを続け、データを追加したいテーブル名を記述します。

テーブル名の後ろに列名を記述し、「VALUES」の後ろに追加するデータの値を指定しましょう。

なお、テーブル内のすべての列に値を追加する場合は、(列名1, 列名2, 列名3…)は記述しなくても問題ありません。

では実際にテーブルを用意してデータを追加していきます。

ここでは次のテーブルを用意しました。

CREATE TABLE kakeibo(himoku varchar(20), date date, money integer);

列名を書いてインサート

まずは列名を書いた場合のインサート方法を見ていきましょう。

次のように記述します。

INSERT INTO kakeibo (himoku, date, money) VALUES ('food', '2020-08-26', 13000);

このINSERT文を実行後にテーブルを全検索すれば、次のような結果になるはずです。

mydb=# SELECT * FROM kakeibo;
 himoku |    date    | money 
--------+------------+-------
 food   | 2020-08-26 | 13000
(1 row)

 

以下のように、追加したい列だけを追加もできます。

INSERT INTO kakeibo (himoku, money) VALUES ('food', 13000);

mydb=# SELECT * FROM kakeibo;
 himoku |    date    | money 
--------+------------+-------
 food   | 2020-08-26 | 13000
 food   |            | 13000
(2 rows)

列名を書かずにインサート

では、列名を記述しない方法を見ていきましょう。

テーブル名の後ろに記述していた列名を削除し、値だけ記述します。

INSERT INTO kakeibo VALUES ('net', '2020-08-18', 8000);

mydb=# SELECT * FROM kakeibo;
 himoku |    date    | money 
--------+------------+-------
 food   | 2020-08-26 | 13000
 food   |            | 13000
 net    | 2020-08-18 |  8000
(3 rows)

上記のように、列名を書いた場合と同じように追加できました。

列名を書いて追加する場合との違いは、追加する列の値を省略可否です。

列名を書かずにインサートする場合は、全ての列の値を記述する必要があります。

1部の列を省略して追加しようとすると、次のようにエラーになるはずです。

mydb=# INSERT INTO kakeibo VALUES ('net', 8000);
ERROR:  column "date" is of type date but expression is of type integer
LINE 1: INSERT INTO kakeibo VALUES ('net', 8000);
                                           ^
HINT:  You will need to rewrite or cast the expression.

上記のサンプルは、date列の値を省略しました。

ポテパンダの一言メモ

・すべての列に値を追加する場合は、列名を書かずにインサートするとラク!
・値を追加しない列があれば、列名を書いてインサートする!

複数データを一括でインサート

ここまで、データをひとつずつ追加する方法を見てきましたが、複数のデータを一括でインサートしたい場合もあるでしょう。

データを一括で追加するには、以下のように値をカンマ区切りで並べます。

mydb=# INSERT INTO kakeibo VALUES ('clothes', '2020-07-29', 12000), ('clothes', '2020-07-26', 5000), ('clothes', '2020-07-20', 6700);
INSERT 0 3

上記のように、「INSERT 0 3」と表示されていることから、3つのデータを追加できました。

テーブルを全検索してみると、追加したデータが表示されます。

mydb=# SELECT * FROM kakeibo;
 himoku  |    date    | money 
---------+------------+-------
 food    | 2020-08-26 | 13000
 food    |            | 13000
 net     | 2020-08-18 |  8000
 clothes | 2020-07-29 | 12000
 clothes | 2020-07-26 |  5000
 clothes | 2020-07-20 |  6700
(6 rows)

たくさんのデータを追加する場合は、この方法が1回で済みおすすめです!

ただし、ひとつでも追加するデータ内容に問題があればエラーになり、1件も追加できません。

mydb=# INSERT INTO kakeibo VALUES ('entertainment', '2020-07-15', 7100), ('entertainment', '2020-07-03', 2800), ('entertainment', '2020-06-27');
ERROR:  VALUES lists must all be the same length
LINE 1: ...', 7100), ('entertainment', '2020-07-03', 2800), ('entertain...
                                                             ^

上記は3つ目のデータである金額の値を空にしました。

エラーになり、全検索でテーブルを確認してもデータはひとつも追加されていないはずです。

セレクト(SELECT)の結果をインサート

ここでは別のテーブルをセレクトし、取得したデータを挿入する方法を見ていきましょう。

サンプルのために、kakeibo_husbandテーブルを用意しました。

用意するカラムはkakeiboと同じにしています。

CREATE TABLE kakeibo_husband(himoku varchar(20), date date, money integer);

そして、次のようにデータをいくつか追加しました。

mydb=# SELECT * FROM kakeibo_husband;
 himoku  |    date    | money 
---------+------------+-------
 game    | 2020-07-11 | 14500
 clothes | 2020-06-16 |  8300
 medical | 2020-05-30 |  4700
(3 rows)

では、このkakeibo_husbandのデータをkakeiboにインサートしましょう。

次のように記述します。

INSERT INTO kakeibo SELECT * FROM kakeibo_husband;

「INSERT INTO」の後ろにデータを追加したいテーブル名を記述し、「FROM」の後ろに追加させるデータのあるテーブル名を記述します。

「SELECT *」ですべてのデータを選択しています。

このSQLクエリを実行すると、次のようにkakeiboテーブルにセレクト結果が追加されているはずです。

mydb=# SELECT * FROM kakeibo;                                                   
 himoku  |    date    | money 
---------+------------+-------
 food    | 2020-08-26 | 13000
 food    |            | 13000
 net     | 2020-08-18 |  8000
 clothes | 2020-07-29 | 12000
 clothes | 2020-07-26 |  5000
 clothes | 2020-07-20 |  6700
 game    | 2020-07-11 | 14500
 clothes | 2020-06-16 |  8300
 medical | 2020-05-30 |  4700
(9 rows)

 

セレクトする列はすべてではなく、指定も可能です。

INSERT INTO kakeibo (himoku, money) SELECT himoku, money FROM kakeibo_husband;

ここでは、date列以外の列の値を取得してみました。

先ほど追加してデータはいったん削除し、上記SQLクエリを実行し、テーブル内のデータを確認すると次のようになっているはずです。

mydb=# SELECT * FROM kakeibo;
himoku  |    date    | money 
---------+------------+-------
 food    | 2020-08-26 | 13000
 food    |            | 13000
 net     | 2020-08-18 |  8000
 clothes | 2020-07-29 | 12000
 clothes | 2020-07-26 |  5000
 clothes | 2020-07-20 |  6700
 game    |            | 14500
 clothes |            |  8300
 medical |            |  4700
(9 rows)

インサートとアップデート(上書き)を同時にする方法

PostgreSQLでは、「UPSERT構文」を使うことでインサートとアップデートを同時に行えます!

このやり方を覚えておくと、データ追加がより便利に行えるのでぜひ覚えてくださいね。

構文は次のようになります。

INSERT INTO テーブル名 (列名1, 列名2, 列名3…) VALUES (値1, 値2, 値3…)
ON CONFLICT (ユニークキー)
DO UPDATE SET 列名1=値1, 列名2=値2, 列名3=値3…;

テーブル名の後ろの「(列名1, 列名2, 列名3…)」は、通常のINSERT文と同様にすべて追加するのであれば省略可能です。

ではサンプルでテーブルを用意し、インサートとアップデートの挙動を確認しましょう。

idカラムをプライマリーキーに設定した、次のテーブルを作成します。

CREATE TABLE user_tb(id integer primary key, name varchar(20), class varchar(10));

このテーブルに次のようにデータの追加を行います。

INSERT INTO user_tb VALUES (1, 'Aoki', 'A') ON CONFLICT (id) DO UPDATE SET name = 'Suzuki';

上記のクエリは、idが1のデータがなければデータを追加し、データがあればnameカラムの値を「Suzuki」にアップデートするという意味です。

この段階ではデータは何もないので、実行後にテーブルを確認すると次のようにデータが追加されています。

mydb=# SELECT * FROM user_tb;
id | name | class 
----+------+-------
  1 | Aoki | A
(1 row)

 

今度はデータを追加した状態でもう一度同じクエリを実行します。

そうすると、次のようにnameカラムの値が更新されるはずです。

mydb=# INSERT INTO user_tb VALUES (1, 'Aoki', 'A') ON CONFLICT (id) DO UPDATE SET name = 'Suzuki';
INSERT 0 1

mydb=# SELECT * FROM user_tb;
id |  name  | class 
----+--------+-------
  1 | Suzuki | A
(1 row)

このように、ユニークキーを参照して、データの有無でインサートとアップデートを行えます!

まとめ

SQLでデータをインサートする方法について解説しました。

INSERT文は、SQLを扱う上で必ずと言っていいほど多用する構文です。

やり方によっては時間の短縮につながり、非常に便利に実行できます。

DBMSによって多少構文が異なる場合もありますが、ぜひこの記事を参考にINSERTの使い方を学んでください!

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。