PostgreSQL | データ型(Data type) | 自動増加型(serial など)

PostgreSQL で使用できるデータ型のうち、自動増加型の使い方について説明する。自動増加型に設定したカラムには、自動的に連続した値が保存される。自動増加型には smallserialserialbigserial の 3 種類がある。

自動増加型

連番型には、扱える数値の範囲が異なる 3 種類のデータ型がある。

サイズ 範囲 別名
smallserial 2 バイト 1 から 32767 serial2
serial 4 バイト 1 から 2147483647 serial4
bigserial 8 バイト 1 から 9223372036854775807 serial8

自動増加型が設定されたカラムを含むテーブルにデータを追加するときは、自動増加型のカラムに直接値を指定するのではなく、既定値が使用されるようにする。すると、これまで登録された値より大きい値、通常は 1 大きい値が自動的に保存される。MySQL でカラムに AUTO_INCREMENT を設定するのと似ている。

自動増加型は内部的にシーケンスを使用して実装されている。

実習として、次のようなテーブルを作成する。

mydb=# create table myfriends (id serial, name varchar(10), address varchar(10));
CREATE TABLE
mydb=#

そして、テーブルにデータを追加する。id カラムのデータ型は自動増加型 serial なので、id に値を指定せずにデータを追加する。

mydb=# insert into myfriends (name, address) values ('Yunho', 'Goyang');
INSERT 0 1
mydb=#

それでは myfriends テーブルのデータを取得して確認する。

mydb=# select * from myfriends;
 id | name  | address
----+-------+---------
  1 | Yunho | Goyang
(1 行)


mydb=#

id カラムには最初の値である 1 が入っている。さらに 3 件のデータを追加してみる。

mydb=# insert into myfriends (name, address) values ('Seonah', 'Bucheon'), ('Yongtae', 'Seoul'), ('Dongeog', 'Gangnam');
INSERT 0 3
mydb=#

再び myfriends テーブルのデータを取得して確認する。

mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
(4 行)


mydb=#

id カラムには自動的に連続した値が入り、2、3、4 の値が保存されている。このように、自動増加データ型をカラムに設定すると、値が指定されない場合は既定値として連続した値が自動的に保存される。もう少し正確に言えば、あくまで最後に保存された値より大きい値が保存されるのであり、必ず連続した値になるわけではない。

自動増加型が設定されたカラムに値を指定してデータを追加する

自動増加型が設定されたカラムに値を指定しなければ、既定値として自動的に連続した値が保存されるが、任意の値を指定してデータを追加することもできる。

現在 4 件のデータを追加した状態で次のデータを追加すると、自動増加型が設定された id カラムには次の既定値である 5 が保存される。

ここでは id カラムに値を指定してデータを追加できる。

mydb=# insert into myfriends values (7, 'Yunjo', 'Paris');
INSERT 0 1
mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
  7 | Younjo  | Paris
(5 行)


mydb=#

データを追加した後にテーブルからデータを取得すると、指定した値がそのまま保存されている。このように、自動増加型が設定されたカラムにも値を指定してデータを追加できる。

ここで再び id カラムを指定せず、既定値でデータを追加すると、id カラムにどの値が入るか確認する。

mydb=# insert into myfriends (name, address) values ('Sueun', 'Yongin');
INSERT 0 1
mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
  7 | Younjo  | Paris
  5 | Sueun   | Yongin
(6 行)


mydb=#

データを追加した後にテーブルからデータを取得すると、id カラムには本来次に入る予定だった 5 が保存されている。

それでは、id カラムに既定値が入るように 2 件のデータをさらに追加してみる。

mydb=# insert into myfriends (name, address) values ('Hansol', 'Seocho'), ('Yujin', 'Unknown');
INSERT 0 2
mydb=# select * from myfriends;
 id |  name   | address
----+---------+---------
  1 | Yunho   | Goyang
  2 | Seonah  | Bucheon
  3 | Yongtae | Seoul
  4 | Dongeog | Gangnam
  7 | Younjo  | Paris
  5 | Sueun   | Yongin
  6 | Hansol  | Seocho
  7 | Yujin   | Unknown
(8 行)


mydb=#

id カラムには、以前保存された値 5 の次として 67 が保存されている。すでに id カラムに 7 という値を持つデータが手動で追加されていたが、重複した値があるかどうかに関係なく連続した値が保存された。

このように、自動増加型が設定されたカラムに値を指定してデータを追加することもできるが、その値は自動的に保存される値には反映されない点に注意が必要である。

PostgreSQL で使用できるデータ型のうち、自動増加型の使い方について説明した。