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