デフォルト値、シーケンス、SERIAL型

デフォルト値

INSERTで指定しなかった列は通常NULLになるが、ある決まった値、または関数の実行結果などにすることができる。
これをデフォルト値という。

列名 型[ 制約][ DEFAULT デフォルト値];
  1. 次のSQLをファイルとして作成。(default041.sql)

    
    
  2. ログイン画面から実行。

    oddtbs=> \i default041.sql
    ...
    oddtbs=> insert into emp (code, name) values(564001, '鈴木義男');
    INSERT 0 1
    oddtbs=> insert into emp (code, name, gender, age) values(564002, '斎藤洋子', 2, 30);
    INSERT 0 1
    oddtbs=> select * from emp;
      code  |   name   | gender | age |  hiredate
    --------+----------+--------+-----+------------
     564001 | 鈴木義男 |      1 |  22 | 2009-08-12
     564002 | 斎藤洋子 |      2 |  30 | 2009-08-12
    (2 rows)
    
    ※ 指定しなかった列はデフォルト値になっていることが確認できる。
    

シーケンス①

シーケンスとは番号を管理して発行するオブジェクトである。

CREATE SEQUENCE シーケンス名;

シーケンスはCURRVALやNEXTVALなどの関数で使用する。
CURRVALは現在の値を取得する。
ただし、そのセッションでNEXTVALを実行していない場合、CURRVALはエラーとなる。
NEXTVALは次の値を取得する。
なお、ここからは\tで表示形式を変更しておく。

oddtbs=> \t
Showing only tuples.
oddtbs=> create sequence seq;
CREATE SEQUENCE
oddtbs=> select currval('seq');
ERROR:  currval of sequence "seq" is not yet defined in this session
※ NEXTVALを実行していないのでエラー。
oddtbs=> select nextval('seq');
       1
oddtbs=> select currval('seq');
       1
oddtbs=> select nextval('seq');
       2
oddtbs=> select currval('seq');
       2

シーケンス②

複雑なシーケンスを定義することもできる。

CREATE SEQUENCE シーケンス名 START 初期値 INCREMENT 増分 MINVALUE 最小値 MAXVALUE 最大値 [CYCLE];

CYCLE指定すると、最大値または最小値をはみ出す場合に、最小値または最大値になり、値が循環する。
指定されなければ、はみ出すときにエラーとなる。

oddtbs=> drop sequence seq;
DROP SEQUENCE
oddtbs=> create sequence seq start 2000 increment 10 minvalue 1000 maxvalue 2050 cycle;
CREATE SEQUENCE
oddtbs=> select nextval('seq');
    2000
oddtbs=> select nextval('seq');
    2010
oddtbs=> select nextval('seq');
    2020
oddtbs=> select nextval('seq');
    2030
oddtbs=> select nextval('seq');
    2040
oddtbs=> select nextval('seq');
    2050
oddtbs=> select nextval('seq');
    1000
※ 最大値を超えてしまうので最小値になった。
oddtbs=> select nextval('seq');
    1010
oddtbs=> select nextval('seq');
    1020

シーケンスをデフォルト値で使用する

社員テーブルの社員番号などは、実際に人間が手動で値を決めるのが難しい場合もある。
その場合、シーケンスをデフォルト値と組み合わせることで解決できる。
なお、ここから表示形式は元に戻す。

  1. 次のSQLをファイルとして作成。(default042.sql)

    
    
  2. oddtbs=> \t
    Tuples only is off.
    oddtbs=> \i default042.sql
    ...
    oddtbs=> insert into emp (name, gender, age) values('鈴木義男', 1, 58);
    INSERT 0 1
    oddtbs=> insert into emp (name, gender, age) values('斎藤洋子', 2, 30);
    INSERT 0 1
    oddtbs=> select * from emp;
      code  |   name   | gender | age |  hiredate
    --------+----------+--------+-----+------------
     564001 | 鈴木義男 |      1 |  58 | 2009-08-12
     564002 | 斎藤洋子 |      2 |  30 | 2009-08-12
    (2 rows)
    
    ※ code列が自動的に割り振られている。
    

SERIAL型

SERIALという特殊な型を使用すると、自動的に上記のようなシーケンス作成とデフォルト値設定を行う。
ただし、シーケンスの性質に関する細かい指定はできず、1から開始して1つづつ増える。

  1. 次のSQLをファイルとして作成。(serial041.sql)

    
    
  2. ログイン画面から実行。

    oddtbs=> \i serial041.sql
    ...
    oddtbs=> insert into emp (name, gender, age) values('鈴木義男', 1, 58);
    INSERT 0 1
    oddtbs=> insert into emp (name, gender, age) values('斎藤洋子', 2, 30);
    INSERT 0 1
    oddtbs=> select * from emp;
     code |   name   | gender | age |  hiredate
    ------+----------+--------+-----+------------
        1 | 鈴木義男 |      1 |  58 | 2009-08-12
        2 | 斎藤洋子 |      2 |  30 | 2009-08-12
    (2 rows)
    
    ※ code列が自動的に1から割り振られている。