Movatterモバイル変換


[0]ホーム

URL:


ひだまりソケットは壊れない

ソフトウェア開発に関する話を書きます。 最近は主に Android アプリ、Windows アプリ (UWP アプリ)、Java 関係です。

まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。

この広告は、90日以上更新していないブログに表示しています。

PostgreSQL と H2 Database の両方で使える SEQUENCE 値生成方法 (MySQL の AUTO_INCREMENT 的なやつ)

SQL DB に新しい行を挿入したときに自動的に ID 値を生成して欲しいことはままある。 このような処理をしてくれるテーブル定義についての話。

MySQL だと AUTO_INCREMENT を使いがち

MySQL を使ってる場合はAUTO_INCREMENT で済ませちゃうことが多い (H2 Database でも使用可)。

CREATETABLE"foo" ("id" BIGINTNOTNULL AUTO_INCREMENT PRIMARY KEY);

PostgreSQL のための AUTO_INCREMENT 以外の方法

ただ、PostgreSQL ではAUTO_INCREMENT が使えない。 代わりに使える方法を 2 つ書いておく。

BIGSERIAL 型を使う

PostgreSQL で、テーブル定義時に型としてBIGSERIAL 型を使用すると内部的に SEQUENCE を利用するようになる。

The data types smallserial, serial and bigserial are not true types, but merely a notational convenience for creating unique identifier columns (similar to theAUTO_INCREMENT property supported by some other databases). In the current implementation, specifying:

CREATETABLE tablename (    colname SERIAL);

is equivalent to specifying:

CREATE SEQUENCE tablename_colname_seq;CREATETABLE tablename (    colnameintegerNOTNULLDEFAULT nextval('tablename_colname_seq'));ALTER SEQUENCE tablename_colname_seq OWNEDBY tablename.colname;
PostgreSQL: Documentation: 10: 8.1. Numeric Types

上の例ではSERIAL 型が使われているが、これはINTEGER 相当なので、BIGINT 相当のサイズにしたければBIGSERIAL を使用すること。

ちなみにBIGSERIAL は H2 Database でも使用できる (ちゃんとしたドキュメントは見当たらなかった)。MySQL でもSERIAL は使用できる (MySQL の場合はSERIALBIGINT になる) が、BIGSERIAL は使えない (MySQL 8.0 で検証)。

外部 SEQUENCE 生成子を使う

標準SQL に従った方法はこれっぽい。 上のSERIAL 型を使った場合と等価な例に載っているような形になる。 ただ、H2 Database は SEQUENCE の所有カラムを明示できないようなので、そこは指定しないでおく。 (H2 Database でも使いたいので。)

CREATE SEQUENCE"foo_id_seq";CREATETABLE"foo" ("id" bigintNOTNULLDEFAULT nextval('foo_id_seq'));
注目記事
検索
最近のコメント
    カテゴリー

    引用をストックしました

    引用するにはまずログインしてください

    引用をストックできませんでした。再度お試しください

    限定公開記事のため引用できません。

    読者です読者をやめる読者になる読者になる

    [8]ページ先頭

    ©2009-2025 Movatter.jp