2017-05-02 3 views
0

かなりストレートです。私はコンフリクトについてのインサートを行うことはできないと思っています。何も選択しませんが、私はライナーが1つ好きです。 c1が一意であるため、競合が発生する可能性があります。私は挿入したいと思いますどの列のIDを返すcolumn1(c1)。postgresqlでIDを挿入して返すにはどうすればいいですか?

insert into foo(c1) 
    VALUES(@c1, 0) 
on conflict (c1) do nothing 
RETURNING (select fooid from foo where [email protected]) 

答えて

1

文節do nothingに達すると、クエリは行を返しません。この場合にはfooidを返すための唯一の方法は、冗長な更新を実行することです:

insert into foo (c1) 
values (@c1) 
on conflict (c1) do update set c1 = excluded.c1 
returning fooid; 
+0

を、私はこれはアウトに最適化されるだろうそれを取りますか? (私たちはそれはすべきだと思いますが、それはありますか?) –

+0

私は分かりませんが、現在の解釈は論理的です。あなたの提案はもっと実用的だと思われます。 – klin

+0

うん。私が「帰ってきた」とか行がないかどうか分かりました。しかし、それは選択された声明です。残念ながら、それは 'c1 = c1'を許可しませんでした。私はそれがノーオペレーションとしてはっきりしていると思っていましたが、私はあなたの答えを使わなければなりませんでした。 T –

0

あなたは冗長な更新を回避するために、共通テーブル式を使用することができます。

WITH payload(c1) AS (
    SELECT @c1 -- your parameters here, you might have to CAST() them 
), insert_action(c1) AS (
    INSERT INTO foo(c1) 
     SELECT c1 FROM payload 
    ON CONFLICT (c1) DO NOTHING 
    RETURNING c1 
) 
SELECT c1 
FROM insert_action 
    RIGHT JOIN payload USING(c1); 
関連する問題