PostgreSQL のテーブルにデータを登録 (INSERT) する複数の方法

PostgreSQL のデータ INSERT 機能

PostgreSQL は標準 SQL に準拠しており、かつ独自の高度な機能を持ち合わせており、データベースにデータを登録する方法も複数用意されています。そこで PostgreSQL にデータを INSERT する複数の方法を紹介します。

これを知っていると、1行づつ SQL で INSERT 文を作成しなくても、一括してデータを INSERT することが出来ます。




テスト用のテーブル作成

まず最初に非常に簡単なテーブルを PostgreSQL データベースに作成し、そのテーブルに対して様々な方法でデータを INSERT していきます。
CREATE TABLE colors (
  id int,
  name text
);


レコードを1行づつ INSERT する

最もシンプルな INSERT 文は次のようになります。"INSERT INTO テーブル名 (列名, ...) VALUES (値, ...)" という書式で、列名と値の数は一致している必要があります。
INSERT INTO colors
  (id, name)
VALUES
  (1, 'foo');

次のように列名の順番を入れ替えても問題なくデータを INSERT 出来ます。列の順番を変更したら、VALUES の中の値の順番も変更する必要があります。
INSERT INTO colors
  (name, id)
VALUES
  ('foo', 1);

なおすべての列の値を VALUES に記述していれば、以下のように INSERT 文に列名を書く必要はありません。
INSERT INTO colors
VALUES
  (2, 'bar');

もしテーブル定義において serial 型や bigserial 型、あるいは順序(シーケンス)という自動採番する列を使っている場合には、データベース側で自動的にデータを計算して値を保管してくれます。その場合には INSERT 文で列名と値を書く必要はありません。

同様に、ある列にデフォルト値の設定がある場合にも INSERT 文で列名とデータを指定する必要はありません。以下に様々なデフォルト値の利用方法を示します。また "DEFAULT" というキーワードを列値の部分に指定すれば、テーブルで定義されたデフォルト値を自動的に設定してくれます。
CREATE TABLE colors (
  id serial,
  name text DEFAULT 'pikachu'
);


-- "id" だけを指定してデータを INSERT する
INSERT INTO colors (id) VALUES (1);
INSERT 0 1

-- "name" 列にデフォルト値が設定された
=> SELECT * FROM colors;
+----+---------+
| id |  name   |
+----+---------+
|  1 | pikachu |
+----+---------+
(1 row)


-- DEFAULT キーワードを使ってデータを INSERT する
=> INSERT INTO colors (id, name) VALUES (DEFAULT, DEFAULT);
INSERT 0 1

-- "id" と "name" 両方の列にデフォルト値が設定された
=> SELECT * FROM colors;
+----+---------+
| id |  name   |
+----+---------+
|  2 | pikachu |
+----+---------+
(1 row)


-- このように書くと、全ての列に対してデフォルト値が適用される
=> INSERT INTO colors DEFAULT VALUES;
INSERT 0 1

=> SELECT * FROM colors;
+----+---------+
| id |  name   |
+----+---------+
|  3 | pikachu |
+----+---------+
(1 row)


複数行のレコードを一度に INSERT する

今度は一度に複数のレコードを1つの INSERT 文で INSERT してみます。次のようにして VALUES の後に括弧でくくられた値をカンマ区切り(,)で並べることによって一度に複数の値を INSERT することが出来ます。
INSERT INTO colors
  (id, name)
VALUES
  (1, 'red'),
  (2, 'blue'),
  (3, 'yellow'),
  (4, 'orange'),
  (5, 'white'),
  (6, 'black'),
  (7, 'pink'),
  (8, 'gray');


SELECT した複数の結果を INSERT する

以下のようにして他のテーブルから SELECT で取得した結果をそのまま INSERT することも出来ます。
INSERT INTO colors
  SELECT id, name FROM address
  WHERE id < 100;