This section describes functions for operating on <firstterm>sequence objects</firstterm>, also called sequence generators or just sequences. Sequence objects are special single-row tables created with <xref linkend="sql-createsequence"/>. Sequence objects are commonly used to generate unique identifiers for rows of a table. The sequence functions, listed in <xref linkend="functions-sequence-table"/>, provide simple, multiuser-safe methods for obtaining successive sequence values from sequence objects. 本節ではシーケンスオブジェクトに対し演算を行う関数について説明します。 シーケンスオブジェクトは、シーケンスジェネレータ、あるいは単にシーケンスとも呼ばれます。 シーケンスオブジェクトは特殊な一行だけのテーブルで、CREATE SEQUENCEで作成されます。 シーケンスオブジェクトは一般的にテーブルの行に一意の識別子を生成するために使用されます。 表 9.53に列挙されているシーケンス関数は、シーケンスオブジェクトから連続したシーケンス値を取得するための、簡易でマルチユーザに対応した関数です。
表9.53 シーケンス関数
Function 関数 Description 説明 |
---|
Advances the sequence object to its next value and returns that value.
This is done atomically: even if multiple sessions
execute <function>nextval</function> concurrently, each will safely
receive a distinct sequence value.
If the sequence object has been created with default parameters,
successive <function>nextval</function> calls will return successive
values beginning with 1. Other behaviors can be obtained by using
appropriate parameters in the <xref linkend="sql-createsequence"/>
command.
シーケンスを次の値に進めてその値を返します。
これは原子的に行われます。複数のセッションが
This function requires <literal>USAGE</literal>
or <literal>UPDATE</literal> privilege on the sequence.
この関数はシーケンスオブジェクトの |
Sets the sequence object's current value, and optionally
its <literal>is_called</literal> flag. The two-parameter
form sets the sequence's <literal>last_value</literal> field to the
specified value and sets its <literal>is_called</literal> field to
<literal>true</literal>, meaning that the next
<function>nextval</function> will advance the sequence before
returning a value. The value that will be reported
by <function>currval</function> is also set to the specified value.
In the three-parameter form, <literal>is_called</literal> can be set
to either <literal>true</literal>
or <literal>false</literal>. <literal>true</literal> has the same
effect as the two-parameter form. If it is set
to <literal>false</literal>, the next <function>nextval</function>
will return exactly the specified value, and sequence advancement
commences with the following <function>nextval</function>.
Furthermore, the value reported by <function>currval</function> is not
changed in this case. For example,
シーケンスオブジェクトの現在の値をセットします。オプションで SELECT setval('myseq', 42); 次の
The result returned by <function>setval</function> is just the value of its
second argument.
This function requires <literal>UPDATE</literal> privilege on the
sequence.
この関数はシーケンスの |
Returns the value most recently obtained
by <function>nextval</function> for this sequence in the current
session. (An error is reported if <function>nextval</function> has
never been called for this sequence in this session.) Because this is
returning a session-local value, it gives a predictable answer whether
or not other sessions have executed <function>nextval</function> since
the current session did.
現在のセッションでこのシーケンスに対して直近の
This function requires <literal>USAGE</literal>
or <literal>SELECT</literal> privilege on the sequence.
この関数はシーケンスの |
Returns the value most recently returned by
<function>nextval</function> in the current session. This function is
identical to <function>currval</function>, except that instead
of taking the sequence name as an argument it refers to whichever
sequence <function>nextval</function> was most recently applied to
in the current session. It is an error to call
<function>lastval</function> if <function>nextval</function>
has not yet been called in the current session.
現在のセッションでこのシーケンスに対して直近の
This function requires <literal>USAGE</literal>
or <literal>SELECT</literal> privilege on the last used sequence.
この関数はシーケンスの |
To avoid blocking concurrent transactions that obtain numbers from
the same sequence, the value obtained by <function>nextval</function>
is not reclaimed for re-use if the calling transaction later aborts.
This means that transaction aborts or database crashes can result in
gaps in the sequence of assigned values. That can happen without a
transaction abort, too. For example an <command>INSERT</command> with
an <literal>ON CONFLICT</literal> clause will compute the to-be-inserted
tuple, including doing any required <function>nextval</function>
calls, before detecting any conflict that would cause it to follow
the <literal>ON CONFLICT</literal> rule instead.
Thus, <productname>PostgreSQL</productname> sequence
objects <emphasis>cannot be used to obtain <quote>gapless</quote>
sequences</emphasis>.
同一のシーケンスから数値を取得する同時実行トランザクション同士のブロックを防止するため、nextval
で得られる値は、呼び出しているトランザクションが後でアボートした際に再利用目的での回収は行われません。
これは、トランザクションのアボートあるいはデータベースのクラッシュによって、割り当てられるシーケンスの値に欠番ができることがある、ということを意味します。
これはトランザクションのアボートがなくても起こります。
例えばON CONFLICT
句のあるINSERT
では、挿入される予定のタプルについて、必要となるすべてのnextval
の呼び出しも含めて計算し、その後でON CONFLICT
のルールを代わりに使用することになる競合について検知します。
従って、PostgreSQLのシーケンスオブジェクトは「欠番のない」シーケンスを得るために使うことはできません。
Likewise, sequence state changes made by <function>setval</function>
are immediately visible to other transactions, and are not undone if
the calling transaction rolls back.
同様に、setval
が行ったシーケンス状態の変更は直ちに他のトランザクションから可視になり、トランザクションがロールバックしても元には戻りません。
If the database cluster crashes before committing a transaction
containing a <function>nextval</function>
or <function>setval</function> call, the sequence state change might
not have made its way to persistent storage, so that it is uncertain
whether the sequence will have its original or updated state after the
cluster restarts. This is harmless for usage of the sequence within
the database, since other effects of uncommitted transactions will not
be visible either. However, if you wish to use a sequence value for
persistent outside-the-database purposes, make sure that the
<function>nextval</function> call has been committed before doing so.
nextval
やsetval
の呼び出しを含むトランザクションがコミットする前にデータベースクラスタがクラッシュすると、そのシーケンスの状態は永続的な記憶装置に格納されないかもしれず、クラスタが再起動した後にそのシーケンスが元の状態のままなのか、更新された状態になっているのかは定かではありません。
コミットされていないトランザクションは可視ではないので、これはデータベース内のシーケンスの利用に関して言えば無害です。
しかし、シーケンス値をデータベースの外での永続的な利用を目的として使う場合は、nextval
の呼び出しが確実にコミットされてから利用してください。
The sequence to be operated on by a sequence function is specified by
a <type>regclass</type> argument, which is simply the OID of the sequence in the
<structname>pg_class</structname> system catalog. You do not have to look up the
OID by hand, however, since the <type>regclass</type> data type's input
converter will do the work for you. See <xref linkend="datatype-oid"/>
for details.
シーケンス関数により操作されるシーケンスはregclass
引数で指定されますが、それはpg_class
システムカタログ内にある、そのシーケンスの単なるOIDです。
しかしながら、手作業でOIDを検索する必要はなく、regclass
データ型の入力変換器が代わってその作業を行ってくれます。
詳細は8.19を見てください。