34695

  • フォーラムは新サイトへ移行しました。
  • このフォーラムではゲスト投稿が禁止されています

なし 34695

msg# 1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2019-12-20 20:59
KETNO  半人前   投稿数: 9
nexrval実行前にcurrval実行するとエラーになるも正解ではないか?

なし Re: 34695

msg# 1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2019-12-21 13:37
yama708  半人前   投稿数: 10
問題のIDは34695で合っていますか?
もしかしたら34569なのかな、と思ったのですが。

「nexrval実行前にcurrval実行するとエラーになる」
と言う選択肢がないようなので、実際の選択肢の文章を載せると分かりやすいと思います。

なし Re: 34695

msg# 1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2019-12-21 20:56
KETNO  半人前   投稿数: 9
コメントありがとうございます。idは34695です。

◼️問題
以下のSQLが実行された場合の説明として、正しいものはどれか。
CREATE SEQUENCE sample_seq CACHE 5 NO CYCLE;
SELECT setval('sample_seq', 100);

◼️回答の選択肢
「SELECT currval('sample_seq');」を実行するとエラーとなる
「SELECT nextval('sample_seq');」を実行すると105が返される
「SELECT currval('sample_seq');」を実行すると5が返される
「SELECT nextval('sample_seq');」を実行すると100が返される
○ 「SELECT nextval('sample_seq');」を実行すると101が返される

◼️質問
以下選択肢はなぜ正しくないのでしょうか。

「SELECT currval('sample_seq');」を実行するとエラーとなる

なし Re: 34695

msg# 1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2019-12-21 23:39 | 最終変更
arashi1977  長老 居住地: 広島  投稿数: 1715
横から失礼します。

引用:
◼️質問
以下選択肢はなぜ正しくないのでしょうか。

「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
しかしこの設問では「SELECT setval('sample_seq', 100);」をしているので、現在のセッションにおけるsample_seqの値が「100」であると設定されます。
現在のセッションにおけるシーケンスが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
このセッションでは、シーケンス sample_seqの現在の値がまだ未定義です」と言われてますので、定義済みの状態ならエラーにはならない、ということなんですね。

なし Re: 34695

msg# 1.1.1.1.1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2019-12-22 11:00
KETNO  半人前   投稿数: 9
ご丁寧に解説頂き誠にありがとうございます。
頂いた内容で理解できました。

非常に助かりました!

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.