2016-04-20 10 views
0

これはバグ、機能、またはドキュメントの問題であるかどうかわかりません。Postgres 9.5に挿入された行のIDを取得する方法UPSERT

のは、私は、このテーブルがあるとしましょう:NOを与える INSERT INTO tags(value) VALUES('a') ON CONFLICT(value) DO NOTHING RETURNING idで再度実行

:あなたは新しく挿入された値しかしのIDを取得しますINSERT INTO tags(value) VALUES('a') RETURNING id;を実行する場合

CREATE TABLE tags(
    id BIGSERIAL PRIMARY KEY, 
    value TEXT UNIQUE NOT NULL, 
    creation_time TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP 
); 

id、つまり、どちらかがBUGであることを意味します。つまり、ドキュメントhttp://www.postgresql.org/docs/9.5/static/sql-insert.html

INSERT INTO table_name [ AS alias ] [ (column_name [, ...]) ] 
    { DEFAULT VALUES | VALUES ({ expression | DEFAULT } [, ...]) [, ...] | query } 
    [ ON CONFLICT [ conflict_target ] conflict_action ] 
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] 

これは基本的にあなたがCANの両方を使用することを意味し、誰もこの同じ問題を見つけて解決しましたか?

答えて

2

ドキュメントは正しく、バグはありません。この部分見落とし:CONFLICT ON UPDATE句がない場合、オプションのRETURNING句は、INSERTを計算させる

各行実際挿入または更新に基づいて、戻り値(複数可)を、使用しました)

(強調鉱山)

あなたがDO NOTHINGを指定した場合、その後の文はどちらもinseますrtも何も更新しないので、IDを返すことはできません。

関連する問題