インサート(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の使い方を学んでください!
・すべての列に値を追加する場合は、列名を書かずにインサートするとラク!
・値を追加しない列があれば、列名を書いてインサートする!