Re: 34695
arashi1977
居住地: 広島
投稿数: 1715
横から失礼します。
引用:■答え
すでに「SELECT setval('sample_seq', 100);」がしてあるから。
CREATE SEQUENCEした時点では、現在のセッション(PostgreSQLのpsqlで接続してから切断するまで)内で、sample_seqの値を持っていません。その状態で「currval('sample_seq');」しても、現在のsample_seqの値がわからないのでエラーになります。
しかしこの設問では「SELECT setval('sample_seq', 100);」をしているので、現在のセッションにおけるsample_seqの値が「100」であると設定されます。
現在のセッションにおけるシーケンスが100だとわかっているので、currval('sample_seq')してもエラーにはなりません。
そして、現在のシーケンスが100だとわかっているので、nextval('sample_seq')すると、次の値である「101」が取得できるんですね。
ちなみに、これはpsqlセッションを切断して再接続したときも同じことです。セッション開始時に現在のシーケンスが取得できていなければエラーになりますが、setval()やnextval()した後ならエラーになりません。
この辺は、エラーメッセージにも書いてありますが
引用:「このセッションでは、シーケンス sample_seqの現在の値がまだ未定義です」と言われてますので、定義済みの状態ならエラーにはならない、ということなんですね。
引用:
◼️質問
以下選択肢はなぜ正しくないのでしょうか。
「SELECT currval('sample_seq');」を実行するとエラーとなる
すでに「SELECT setval('sample_seq', 100);」がしてあるから。
CREATE SEQUENCEした時点では、現在のセッション(PostgreSQLのpsqlで接続してから切断するまで)内で、sample_seqの値を持っていません。その状態で「currval('sample_seq');」しても、現在のsample_seqの値がわからないのでエラーになります。
template1=# create database pingt_test;
CREATE DATABASE
template1=# \c pingt_test
You are now connected to database "pingt_test" as user "postgres".
pingt_test=# CREATE SEQUENCE sample_seq CACHE 5 NO CYCLE;
CREATE SEQUENCE
pingt_test=# SELECT currval('sample_seq');
ERROR: currval of sequence "sample_seq" is not yet defined in this session
現在のセッションにおけるシーケンスが100だとわかっているので、currval('sample_seq')してもエラーにはなりません。
そして、現在のシーケンスが100だとわかっているので、nextval('sample_seq')すると、次の値である「101」が取得できるんですね。
pingt_test=# SELECT setval('sample_seq', 100);
setval
--------
100
(1 row)
pingt_test=# SELECT currval('sample_seq');
currval
---------
100
(1 row)
pingt_test=# SELECT nextval('sample_seq');
nextval
---------
101
(1 row)
ちなみに、これはpsqlセッションを切断して再接続したときも同じことです。セッション開始時に現在のシーケンスが取得できていなければエラーになりますが、setval()やnextval()した後ならエラーになりません。
pingt_test=# \q
$ psql -U postgres pingt_test
psql (12rc1)
Type "help" for help.
pingt_test=# \ds
List of relations
Schema | Name | Type | Owner
--------+------------+----------+----------
public | sample_seq | sequence | postgres
(1 row)
pingt_test=# SELECT currval('sample_seq');
ERROR: currval of sequence "sample_seq" is not yet defined in this session
pingt_test=# SELECT setval('sample_seq', 200);
setval
--------
200
(1 row)
pingt_test=# SELECT currval('sample_seq');
currval
---------
200
(1 row)
この辺は、エラーメッセージにも書いてありますが
引用:
ERROR: currval of sequence "sample_seq" is not yet defined in this session
投稿ツリー
- 34695 (KETNO, 2019-12-20 20:59)