PostgreSQLスキルアップノート(自己啓発のための個人サイト)

連番型(SERIALなど)


【一覧に戻る】


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ 連番型(SERIALなど)
■■■■
■■■■
■■■■ 2013/02/11
■■■■ 使用環境:PostgreSQL9.1.7 (CentOS6.2)
                                                                   (C) 2013 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
★自己都合によりマニュアルへのリンクは9.2としています。ご了承下さい。
★このページはそのままカット&ペーストで実行して試すことができます。


【マニュアル】

→●[マニュアル]


【参考記事】
−



■1■ 概要
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


連番型はいわゆるオートナンバー
シーケンスとは別のもので、テーブルに定義する。

連番型は以下の3種類
(9.2からsmallserialが追加された)

smallserial   2B  4桁     1から32767              smallint
serial        4B  9桁     1から2147483647(21億)  integer
bigserial     8B  それ以上  1から9223372036854775807 bigint


マニュアル上は「数値データ型」に分類されるが本当の意味でのデータ型ではない。(マニュアルより)
実体はintegerなどのデータ型とSEQUENCEを組み合わせたもの。




■2■ 定義方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


・必要最低限の定義

drop table t1;
CREATE TABLE t1 (c1 SERIAL,c2 varchar(20));


・PKに使う場合には以下のようにPRIMARYを指定する必要あり

drop table t1;
CREATE TABLE t1 (c1 SERIAL PRIMARY KEY,c2 varchar(20));


・「ROWID的な」用途にも使うことができる。
  この場合はPRIMARYは別の項目に付与されているはずなので、
  以下のようにUNIQUEを与える。

drop table t1;
CREATE TABLE t1 (c1 SERIAL UNIQUE,c2 varchar(20));



■3■ 使用方法
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


値を指定しないか、DEFAULTキーワードでinsertする。

insert into t1 (c2) values('renban');

insert into t1 values(DEFAULT,'renban');

select * from t1;

 c1 |   c2
----+--------
  1 | renban
  2 | renban
  3 | renban
  4 | renban




■4■ 注意点
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━


・NOT NULLは自動で付与される。
・UNIQUE制約/PRIMARY KEY制約は自動では作られない。追加で定義することが推奨。★
・実体はシーケンスなので行の削除が行われていなくとも欠番が発生するとマニュアル記載あり。
・テーブルの列が削除された場合にシーケンス自動で削除。 (OWNED BY)
・列を削除しないでシーケンスを削除することは可能。強制的に列のデフォルト式が削除される。

・insertで値を指定するとその値で入ってしまうので注意
 insert into t1 (c1,c2) values(1000,'renban');



■5■ 【参考】serialの実体
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

【参考】

・CREATE TABLE tablename (colname SERIAL);

とすると以下が行われる

・CREATE SEQUENCE tablename_colname_seq;
・CREATE TABLE tablename (colname integer NOT NULL DEFAULT nextval(’tablename_colname_seq’));
・ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

postgres=# \d t1
                                Table "public.t1"
 Column |         Type          |                    Modifiers
--------+-----------------------+-------------------------------------------------
 c1     | integer               | not null default nextval('t1_c1_seq'::regclass)
 c2     | character varying(20) |


以上 
inserted by FC2 system