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'
名前であると想定され、にキャストされます。現在の にその名前のシーケンスが見つからない場合、例外が発生します。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<>fiddle
古いsqlfiddle