Tôi không rõ lý do tại sao bạn làm với CHỌN đầu tiên, nhưng lý do bạn chỉ nhận được CẬP NHẬT id
là do bạn không chọn CHÈN trả lại.
Như đã đề cập (và được liên kết) trong các nhận xét, Postgres 9.5 hỗ trợ Điều khoản INSERT ON CONFLICT, một cách dễ sử dụng hơn nhiều.
Và một số ví dụ về trước và sau 9.5:
Trước 9.5:cách phổ biến sử dụng 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;
Sau 9.5:sử dụng INSERT .. ON CONFLICT
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;
CẬP NHẬT:
Như đã gợi ý trong một nhận xét, có thể có một chút khuyết điểm khi sử dụng INSERT .. ON CONFLICT
đường.
Trong trường hợp bảng sử dụng tự động tăng và truy vấn này xảy ra rất nhiều, thì WITH
có thể là một lựa chọn tốt hơn.
Xem thêm: https://stackoverflow.com/a/39000072/1161463