PostgreSQLシーケンス完全ガイド!自動で番号を振る連番管理の仕組みを初心者向けに解説
生徒
「データベースにデータを登録するとき、会員番号とか出席番号を自動で1、2、3……と付けてくれる便利な機能はないんですか?」
先生
「ありますよ!PostgreSQL(ポストグレスキューエル)というデータベースには『シーケンス』という仕組みがあって、自動で重複しない連番を作ってくれるんです。」
生徒
「手動で番号を入力しなくていいのは楽ですね。でも、どうやって順番を覚えているんですか?」
先生
「シーケンスは、データベースの中に専用の『番号札を配る機械』を置くようなイメージです。誰かが番号を求めたら、次に渡すべき番号をすぐに教えてくれるんですよ。」
1. PostgreSQLのシーケンスとは?
PostgreSQLにおけるシーケンス(Sequence)とは、日本語で「連続」や「順序」という意味を持つ言葉です。データベースの世界では、主に「一意な識別番号(ID)」を自動的に生成するために使われます。
例えば、ネットショップの注文管理や、学校の生徒名簿を想像してみてください。新しいデータが入るたびに、人間が「ええと、前回の番号は100だったから、次は101だな」と手動で入力するのは大変ですし、何より間違えて同じ番号を二人につけてしまうリスクがあります。
シーケンスを使えば、データベース側が「次は101です」「その次は102です」と正確に管理してくれるため、情報の重複を防ぎ、安全にデータを保存することができるのです。
エンジニアの必須スキル「SQL」を、 図解と豊富な練習問題でゼロから体系的に学びたい人へ。 MySQLやPostgreSQLなど、各種データベースに対応した不朽の入門書です。
SQL 第2版 ゼロからはじめるデータベース操作をAmazonで見る※ Amazon広告リンク
2. シーケンスの仕組みを身近な例で例えると?
プログラミングやデータベースに触れたことがない方には、銀行の窓口にある「番号札の発券機」をイメージしていただくと分かりやすいでしょう。
発券機のボタンを押すと、機械は現在の番号に1を足した数字を紙に印字して出します。そして、機械の内部では「次に誰かが来たらこの番号を出すぞ」という記録が更新されます。これがデータベースの内部で行われている「シーケンスの更新」です。
もし、同時に二人がボタンを押しても、機械は瞬時に順番を判定して、別々の番号を渡してくれます。この「絶対にかぶらない」というのが、データベースの連番管理において非常に重要なポイントになります。専門用語では、この重複しない性質を「ユニーク(一意性)」と呼びます。
3. なぜ連番管理が必要なのか?(主キーの役割)
ここで少し難しい言葉ですが、「主キー(Primary Key)」という用語を覚えましょう。主キーとは、表の中の一行一行を確実に見分けるための「背番号」のようなものです。
同姓同名の「山田太郎」さんが二人いた場合、名前だけでは区別がつきません。しかし、シーケンスで発行した「会員ID」が1番と2番であれば、確実に別人だとわかります。シーケンスは、この主キーを作るための最強の味方なのです。
4. 実際にシーケンスを作成してみよう
それでは、具体的にどのようにシーケンスを作るのか見ていきましょう。まずは、1から順に増えていくシンプルなシーケンスを作成する命令(SQL)です。
CREATE SEQUENCE sample_seq START 1;
この命令は「sample_seq(サンプル・シークエンス)」という名前の発券機を、1番から開始するように設置しなさい、という意味になります。これだけで、番号を生成する準備が整いました。
5. 番号を取得してテーブルにデータを追加する
次に、作成したシーケンスを使って、実際に名簿テーブルにデータを登録してみましょう。ここでは「nextval」という関数(特定の処理を行う命令)を使います。
まずは、データを入れる前の空っぽの状態のテーブルを確認しましょう。
id | name | category
---+---------+----------
(0 rows)
ここに、シーケンスを使ってデータを3件追加してみます。
INSERT INTO items (id, name, category)
VALUES (nextval('sample_seq'), 'リンゴ', '果物');
INSERT INTO items (id, name, category)
VALUES (nextval('sample_seq'), 'キャベツ', '野菜');
INSERT INTO items (id, name, category)
VALUES (nextval('sample_seq'), 'バナナ', '果物');
実行後のテーブルの内容は以下のようになります。
id | name | category
---+----------+----------
1 | リンゴ | 果物
2 | キャベツ | 野菜
3 | バナナ | 果物
「nextval」と書くだけで、自動的に1、2、3と数字が割り振られているのがわかりますね。これがシーケンスの基本的な使い方です。
6. もっと便利に!SERIAL型(シリアル型)とは?
実は、PostgreSQLにはもっと簡単に連番を設定する方法があります。それが「SERIAL(シリアル)型」です。これを使うと、わざわざ自分でシーケンスを作成しなくても、テーブルを作るときに自動的に連番の仕組みを組み込んでくれます。
以下のコードは、会員情報のテーブルを作成する例です。
CREATE TABLE members (
id SERIAL PRIMARY KEY,
name TEXT
);
この「SERIAL」と指定された「id」という項目は、データを追加するたびに自動で1ずつ増えるようになります。初心者のうちは、このSERIAL型を使うのが一番手軽でおすすめです。
7. SERIAL型を使ったデータの追加例
SERIAL型を使った場合、データを追加するときに「id」の値を指定する必要はありません。データベースが裏側で気を利かせて、勝手に番号を振ってくれるからです。
実行前のデータがない状態です。
id | name
---+------------
(0 rows)
データを登録してみましょう。名前だけを指定して登録します。
INSERT INTO members (name) VALUES ('田中さん');
INSERT INTO members (name) VALUES ('佐藤さん');
INSERT INTO members (name) VALUES ('鈴木さん');
INSERT INTO members (name) VALUES ('高橋さん');
実行後のテーブルを確認すると、以下のようになっています。
id | name
---+------------
1 | 田中さん
2 | 佐藤さん
3 | 鈴木さん
4 | 高橋さん
どうでしょうか?「id」に何も入れていないのに、自動で1から4までの番号が振られていますね。これが現代のシステム開発で非常によく使われる「自動採番」という技術です。ミスが起きにくく、プログラムを書く手間も省ける素晴らしい機能です。
8. シーケンスを扱う上での注意点
とても便利なシーケンスですが、一つだけ覚えておいてほしい性質があります。それは「一度発行した番号は欠番になることがある」という点です。
例えば、番号札を引いたけれど、用事ができて帰ってしまったお客さんがいるとします。その番号札(例えば5番)は使われずに終わりますが、次に並んだ人には「6番」が渡されますよね。データベースでも同じで、データの登録を途中でキャンセルした場合などには、その番号は飛び石(欠番)になります。
「1、2、4、5……」のように3が抜けてしまうことがありますが、データベースの管理上は「重複していないこと」が最も重要なので、欠番が出ることは不具合ではありません。あまり神経質にならず、「番号がかぶらなければOK!」という気持ちで使いましょう。
9. より高度なシーケンスの設定方法
基本的には1ずつ増える設定で十分ですが、シーケンスはカスタマイズすることも可能です。例えば、「100から始めたい」「5ずつ増やしたい」といった要望にも応えられます。
CREATE SEQUENCE advanced_seq
START WITH 100
INCREMENT BY 5;
この命令で作成したシーケンスを使うと、番号は「100、105、110……」と増えていきます。イベントのチケット番号や、特定のルールに基づいたID管理が必要な場合に役立つ設定です。このように、シーケンスはシンプルながらも奥が深く、どんなシステムでも必ずと言っていいほど使われている重要な技術なのです。