INSERTで指定しなかった列は通常NULLになるが、ある決まった値、または関数の実行結果などにすることができる。
これをデフォルト値という。
列名 型[ 制約][ DEFAULT デフォルト値];
次のSQLをファイルとして作成。(default041.sql)
ログイン画面から実行。
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
社員テーブルの社員番号などは、実際に人間が手動で値を決めるのが難しい場合もある。
その場合、シーケンスをデフォルト値と組み合わせることで解決できる。
なお、ここから表示形式は元に戻す。
次のSQLをファイルとして作成。(default042.sql)
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という特殊な型を使用すると、自動的に上記のようなシーケンス作成とデフォルト値設定を行う。
ただし、シーケンスの性質に関する細かい指定はできず、1から開始して1つづつ増える。
次のSQLをファイルとして作成。(serial041.sql)
ログイン画面から実行。
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から割り振られている。