[postgresql][sql]PostgreSQL上でオートナンバーを使う

Accessで作った既存のデータベースをPostgreSQLにエクスポートすると、オートナンバー型がinteger型に変更されます。
これをPostgreSQL上でもオートナンバーになるように、デフォルト値を直前の数値をインクリメントした値に設定します。
カラムを新規作成するときにはデータ型[SERIAL]を選べばいいのですが、途中で変更するのはちょっと面倒な処理が必要です。


SQLCREATE SEQUENCEを使うわけですが、phpPgAdminだとGUIから登録可能。


簡単な流れは以下のとおり。

  1. [シーケンス]に開始値を指定して登録
  2. 該当カラムの[デフォルト]に「nextval('"[作成したシーケンス名]"'::regclass)」を追加


詳細な処理は以下。

[シーケンス]に開始値を指定して登録

該当データベースからスキーマを選択します。何も指定せずエクスポートした場合には「public」になっているはず。


[シーケンス]をクリックし、[シーケンスを作成する]をクリック、以下を入力する。カッコ内はPostgreSQLのdocsに載っている名前。

名前(name) シーケンスの名前。新規にSERIAL型のカラムを登録すると[テーブル名]_[カラム名]_seqという名前のシーケンスができます。
増加値(increment) 直前の数値からいくつ増加するか。ここでは[1]を。
最小値(minvalue) 番号の最小値。デフォルトは1。
最大値(maxvalue) 番号の最大値。long int なのでここでは9223372036854775807を入力。
始値(start) 番号の開始値。デフォルトは最小値と同じ。ここでは100番から開始するので[100]を入力。
キャッシュ(cache) アクセスを早くするためにキャッシュしておく番号の数。新規にSERIAL型のカラムを登録すると32になるので[32]と入力してますがイマイチ有用性が分からないですすいません。
Can cycle?(CYCLE) 番号が最大値を超えた場合に最小値に戻るかどうか。long intを使い切るとかあり得ない。


これで[作成]をクリックすればシーケンス作成完了。

カラムのデフォルト値を変更

次に該当テーブルからオートナンバーに変更したいカラムの[変更]をクリック。
データ型は[integer]のまま、[デフォルト]に以下の文字列を入力する。

nextval('"[作成したシーケンス名]"'::regclass)

[変更]をクリック。

これで、データを登録するときにIDを入力しなくても勝手に番号が割り振られるようになります。