Tidak jelas bagi saya mengapa Anda melakukannya di WITH first SELECT, tetapi alasan Anda hanya mendapatkan UPDATE id
adalah karena Anda tidak memilih INSERT return.
Seperti yang disebutkan (dan ditautkan) dalam komentar, Postgres 9.5 mendukung INSERT ON CONFLICT Clause yang merupakan cara yang jauh lebih bersih untuk digunakan.
Dan beberapa contoh sebelum dan sesudah 9.5:
Sebelum 9.5:cara umum menggunakan 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;
Setelah 9.5:menggunakan INSERT .. PADA KONFLIK
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;
PERBARUI:
Seperti yang diisyaratkan dalam komentar mungkin ada sedikit kontra menggunakan INSERT .. ON CONFLICT
cara.
Jika tabel menggunakan auto-increment dan query ini sering terjadi, maka WITH
mungkin pilihan yang lebih baik.
Lihat selengkapnya:https://stackoverflow.com/a/39000072/1161463