PostgreSQL シーケンス操作
シーケンス操作の例一覧 nextval/currval/setval
変更
SQL
--シーケンスを進める
SELECT nextval('foo_seq');
実行
nextval
---------
1001
再実行
nextval
---------
1002
加算される値はincrement_byに依存(デフォルトは1)
pgdb=# SELECT last_value FROM foo_seq;
last_value
------------
1000
(1 行)
pgdb=# begin;
BEGIN
pgdb=# SELECT nextval('foo_seq');
nextval
---------
1001
(1 行)
pgdb=# SELECT nextval('foo_seq');
nextval
---------
1002
(1 行)
pgdb=# SELECT nextval('foo_seq');
nextval
---------
1003
(1 行)
pgdb=# rollback;
ROLLBACK
pgdb=# SELECT last_value FROM foo_seq;
last_value
------------
1003
(1 行)
トランザクションで進めたシーケンスの値はロールバックしても元に戻らない。
SQL
--シーケンスの値を設定
SELECT setval('foo_seq', 1000);
setval
---------
1000
SQL
--シーケンスがセットされた場合は1001を返す
SELECT setval('foo_seq', 1000, true);
--シーケンスがセットされた場合は1000を返す
SELECT setval('foo_seq', 1000, false);
setval
---------
1000
trueの場合
pgdb=# SELECT * FROM foo_seq;
sequence_name | last_value | start_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
foo_seq | 1000 | 1 | 1 | 9223372036854775807 | 1 | 1 | 0 | f | t
(1 行)
falseの場合
pgdb=# SELECT * FROM foo_seq;
sequence_name | last_value | start_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+-------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
foo_seq | 1000 | 1 | 1 | 9223372036854775807 | 1 | 1 | 1 | f | f
(1 行)
\dでも確認可能
pgdb=# \d foo_seq;
シーケンス "public.foo_seq"
列 | 型 | 値
---------------+---------+---------------------
sequence_name | name | foo_seq
last_value | bigint | 1000
start_value | bigint | 1
increment_by | bigint | 1
max_value | bigint | 9223372036854775807
min_value | bigint | 1
cache_value | bigint | 1
log_cnt | bigint | 1
is_cycled | boolean | f
is_called | boolean | f
初期化
SQL
--シーケンス初期化(セットされた場合は1を返す)
SELECT setval('foo_seq', 1, false);
取得
SQL
--シーケンスの現在の値を取得
SELECT currval('foo_seq');
currval
---------
1000