WITH first SELECTで行う理由は私にはわかりませんでしたが、UPDATE id
しか返さない理由はわかりませんでした。 INSERTreturnを選択していないためです。
コメントで言及されている(そしてリンクされている)ように、Postgres9.5はINSERTONCONFLICT句をサポートしています。これははるかにクリーンな使用方法です。
そして、9.5の前後のいくつかの例:
9.5より前:WITHを使用する一般的な方法
WITH u AS (
UPDATE products
SET product_key='test123', count_parts=33
WHERE product_key = 'test123'
RETURNING id
),i AS (
INSERT
INTO products ( product_key, count_parts )
SELECT 'test123', 33
WHERE NOT EXISTS( SELECT 1 FROM u )
RETURNING id
)
SELECT *
FROM ( SELECT id FROM u
UNION SELECT id FROM i
) r;
9.5以降:INSERT ..ONCONFLICTの使用
INSERT INTO products ( product_key, count_parts )
VALUES ( 'test123', 33 )
ON CONFLICT ( product_key ) DO
UPDATE
SET product_key='test123', count_parts=33
RETURNING id;
更新:
コメントで示唆されているように、INSERT .. ON CONFLICT
を使用するとわずかな短所があるかもしれません 仕方。
自動インクリメントを使用するテーブルで、このクエリが頻繁に発生する場合は、WITH
より良いオプションかもしれません。
もっと見る: https://stackoverflow.com/a/39000072/1161463 >