RETURNING
これは、1回の往復で可能です。 データベースへ:
INSERT INTO tbl(filename)
VALUES ('my_filename')
RETURNING tbl_id;
tbl_id 通常はserialになります またはIDENTITY (Postgres 10以降)列。詳細はマニュアルをご覧ください。
明示的に値をフェッチ
filenameの場合 tbl_idを含める必要があります (冗長に)、引き続き単一のクエリを使用できます。
lastval()を使用します または、より具体的な currval() :
INSERT INTO tbl (filename)
VALUES ('my_filename' || currval('tbl_tbl_id_seq') -- or lastval()
RETURNING tbl_id;
参照:
- 同じINSERT中の別の列のシリアル列の参照値
プロセスで複数のシーケンスが進行する可能性がある場合(トリガーやその他の副作用によっても)、確実 方法はcurrval('tbl_tbl_id_seq')を使用することです 。
シーケンスの名前
文字列リテラル 'tbl_tbl_id_seq' 私の例では、実際の シーケンスの名前であり、regclassにキャストされます 、現在のsearch_pathにその名前のシーケンスが見つからない場合、例外が発生します 。
tbl_tbl_id_seq テーブルの自動生成されたデフォルトですtbl シリアル列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<>ここでフィドル
古いsqlfiddle