CTE を使用して、シーケンスから値を一度取得し、繰り返し使用できます。
WITH cte AS (
SELECT nextval('foo_id_seq') AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM cte;
データ変更コマンドを含む CTE には、 Postgres 9.1 以降が必要です。
シーケンスの名前がわからない場合は、
pg_get_serial_sequence()
代わりに次を使用します。
WITH i AS (
SELECT nextval(pg_get_serial_sequence('foo', 'id')) AS id
)
INSERT INTO foo (id, ltree)
SELECT id, '1.' || id
FROM i;
テーブル名「foo」が DB 内のすべてのスキーマで一意でない可能性がある場合は、スキーマ修飾します。また、名前のつづりが標準的でない場合は、二重引用符で囲む必要があります。
pg_get_serial_sequence('"My_odd_Schema".foo', 'id')
簡単なテストでは、@Mark のアイデアも機能する可能性があることが示されました。lastval()
INSERT INTO foo (ltree) VALUES ('1.' || lastval());
currval
nextval
現在のセッションでこのシーケンスに対してによって取得された最新の値を返します。nextval
(このセッションでこのシーケンスに対して が一度も呼び出されていない場合は、エラーが報告されます。)これはセッション ローカルな値を返すため、現在のセッションが実行されてから他のセッションが実行されたかどうかに関係なく、予測可能な答えが得られますnextval
。
この関数は、シーケンスに対する特権を必要USAGE
とします。SELECT
lastval
nextval
現在のセッションでによって最後に返された値を返します。この関数はと同じですがcurrval
nextval
、引数としてシーケンス名を使用する代わりに、現在のセッションで最後に適用されたシーケンスを参照する点が異なります。現在のセッションでまだ呼び出されていないlastval
場合、呼び出すとエラーになります。nextval
この関数は、最後に使用されたシーケンスに対する権限を必要USAGE
とします。SELECT
大胆強調鉱山。
しかし、@Bernard がコメントしたように、結局失敗する可能性があります。2 番目の列を埋めるために呼び出される前に、デフォルト値が埋められる (そしてnextval()
プロセスで呼び出される) という保証はありません。したがって、最初の解決策に固執し、確実にしてください。 lastval()
ltree
nextval()