RETURNING
これは、データベースへの1 回の往復で可能です。
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id通常、serialまたはIDENTITY(Postgres 10 以降) column になります。詳しくはマニュアルをご覧ください。
値を明示的にフェッチする
filename(冗長に)含める必要がある場合tbl_idでも、単一のクエリを使用できます。
またはlastval()より具体的なcurrval():
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
見る:
プロセスで複数のシーケンスが進行する可能性がある場合 (トリガーやその他の副作用によっても)、確実な方法は を使用することcurrval('tbl_tbl_id_seq')です。
配列名
この例の文字列リテラルは、シーケンスの 実際の'tbl_tbl_id_seq'名前であると想定され、にキャストされます。現在の にその名前のシーケンスが見つからない場合、例外が発生します。regclasssearch_path
tbl_tbl_id_seqtblは、シリアル列を持つテーブルに対して自動的に生成されるデフォルトですtbl_id。しかし、保証はありません。列のデフォルトは、そのように定義されている場合、任意のシーケンスから値を取得できます。また、テーブルの作成時にデフォルト名が使用される場合、Postgres は単純なアルゴリズムに従って次の自由な名前を選択します。
列のシーケンスの名前がわからない場合はserial、専用の関数を使用してpg_get_serial_sequence()ください。その場で行うことができます:
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval(pg_get_serial_sequence('tbl', 'tbl_id'))
RETURNING tbl_id;
ここでdb<>fiddle
古いsqlfiddle