まじめなことを書くつもりでやっています。 適当なことは 「一角獣は夜に啼く」 に書いています。
この広告は、90日以上更新していないブログに表示しています。
SQL DB に新しい行を挿入したときに自動的に ID 値を生成して欲しいことはままある。 このような処理をしてくれるテーブル定義についての話。
MySQL を使ってる場合はAUTO_INCREMENT
で済ませちゃうことが多い (H2 Database でも使用可)。
CREATETABLE"foo" ("id" BIGINTNOTNULL AUTO_INCREMENT PRIMARY KEY);
ただ、PostgreSQL ではAUTO_INCREMENT
が使えない。 代わりに使える方法を 2 つ書いておく。
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 the
AUTO_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 の場合はSERIAL
でBIGINT
になる) が、BIGSERIAL
は使えない (MySQL 8.0 で検証)。
標準SQL に従った方法はこれっぽい。 上のSERIAL
型を使った場合と等価な例に載っているような形になる。 ただ、H2 Database は SEQUENCE の所有カラムを明示できないようなので、そこは指定しないでおく。 (H2 Database でも使いたいので。)
CREATE SEQUENCE"foo_id_seq";CREATETABLE"foo" ("id" bigintNOTNULLDEFAULT nextval('foo_id_seq'));
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。