0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

postgresql で sequence を後付けするには

Last updated at Posted at 2025-04-18

他のRDBMから移行してきたデータ

  • csv からテーブルを成り行きで作成してしまった場合、シーケンスを定義は後付けになりがち
  • JetDBなどには、レコードが追加されたときに自動採番される便利な機能があり、移行時に自動採番をRDBMに任せれば、採番コードを追加する必要はないので sequence を定義したいと思うことがあります。
  • シーケンスそのものを追加する記事は多いですが、採番の設定を追加する手順は記事になっていません。

手順

  • まずターゲットテーブル data のカラム名 を id とします。
  • id は レコードの登録順に付けられた数字とします。
  • dataのレコード数は現時点で3000です。 次に追加されるなら 3001になります。
  • 以下SQL で シーケンスを作ります。 
CRETE SEQUENCE id_seq START 3001;
  • テーブルにALTERコマンドを施します。
  • ALTER コマンドのACTION節で、ALTER COLUMNを指定します。 
ALTER TABLE data ALTER COLUMN id SET DEFAULT nextval('id_seq');

このため、マニュアルでは "ALTER TABLE" の項目しかありません。

まとめ

  • 修飾句 "SET DEFAULT " と nextval() 関数の組み合わせです。
  • mysqlなら、AUTO_INCREMENT が使えそうですが、5.7までは、メモリに保管されて揮発する という特性があったりしました。
  • mysql 8.0からは AUTO_INCREMENT の カレント値は、DBに書き込まれるようになったそうです。
  • 採番にTRIGGER をつかうRDBM もあったのを思い出しています。
  • 実はJetDBのオートナンバー型には、ランダム採番の機能があります。こればかりは sequence では対応できません。 UUIDのような「衝突の可能性が限りなく低い」ものであればいいのですが、十進数に限られ、扱いやすい桁数での乱数では、採番時に衝突してやりなおすことを含んだ採番ロジックを組み込まなくてはならなくなります。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?