Postgres tracks this separately in the database with a “sequence. CREATE TABLE t1 ( id integer NOT NULL ); ALTER TABLE public.t1.
- PostgreSQL Tutorial
- Advanced PostgreSQL
- PostgreSQL Interfaces
- PostgreSQL Useful Resources
- Selected Reading
PostgreSQL has the data types smallserial, serial and bigserial; these are not true types, but merely a notational convenience for creating unique identifier columns. These are similar to AUTO_INCREMENT property supported by some other databases.
If you wish a serial column to have a unique constraint or be a primary key, it must now be specified, just like any other data type.
The type name serial creates an integer columns. The type name bigserial creates a bigint column. bigserial should be used if you anticipate the use of more than 231 identifiers over the lifetime of the table. The type name smallserial creates a smallint column.
Syntax
The basic usage of SERIAL dataype is as follows −
Example
Consider the COMPANY table to be created as follows −
Now, insert the following records into table COMPANY −
This will insert seven tuples into the table COMPANY and COMPANY will have the following records −
一般的な型変更の要領でalter table文を用いてSerial型へ変更しようとするとできない。
以下のようにERRORが出て怒られる。
以下のようにERRORが出て怒られる。
そこで、シーケンスオブジェクトを設定することで連番が取れるようにする。
※シーケンスオブジェクトとは?
シーケンスオブジェクトは通常テーブルの行に一意の識別子を生成するために使用されるもの
シーケンスは自動的に連番を生成するための仕組み
参考: https://www.postgresql.jp/document/7.4/html/functions-sequence.html
シーケンスオブジェクトは通常テーブルの行に一意の識別子を生成するために使用されるもの
シーケンスは自動的に連番を生成するための仕組み
参考: https://www.postgresql.jp/document/7.4/html/functions-sequence.html
①シーケンスオブジェクトを作成する
シーケンス名については[テーブル名] _[対象カラム名]_seqとする例が多くみられる。
スタートを1からではなく数値[num]を設定したい場合は下記のようになる。
スタートを1からではなく数値[num]を設定したい場合は下記のようになる。
②連番とするカラムのデフォルト値をシーケンス値とする
連番として設定するカラムについて、デフォルト値をシーケンスの次の値とすることで連番を実現している。
nextval('hoge')関数は、行が挿入された時に、前回設定されたシーケンス値の次の値を列に設定する。
これでデータ挿入時の値の設定ができた。デフォルトでは1+increment_by (デフォルト 1)
nextval('hoge')関数は、行が挿入された時に、前回設定されたシーケンス値の次の値を列に設定する。
これでデータ挿入時の値の設定ができた。デフォルトでは1+increment_by (デフォルト 1)
③テーブルと連動するように変更する
owned byを付加することで、シーケンスを設定した列が削除したときに、そのシーケンス自体も削除されることとなる。
④現在のsequence値を設定する
最後に、値を設定する。
ここで、第3引数にfalseを設定しておくのを忘れないようにする。
データが無い状態であれば1からの連番となる。
ここで、第3引数にfalseを設定しておくのを忘れないようにする。
データが無い状態であれば1からの連番となる。
※select * from [sequence_name];でシーケンスの内容を確認すると、is_calledの値がTrueに設定されている。
この場合、現在last_valueである1の値が既に使用されていることとなる。
つまり、この状態から新しい値を追加すると2から始まることになる。
is_calledをfalseに設定しておくと、last_valueである1はまだ呼び出されていないため、新たな値を追加しても1から開始できる。
この場合、現在last_valueである1の値が既に使用されていることとなる。
つまり、この状態から新しい値を追加すると2から始まることになる。
is_calledをfalseに設定しておくと、last_valueである1はまだ呼び出されていないため、新たな値を追加しても1から開始できる。