PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để Lấy id của hàng đã chèn khi sử dụng upert với WITH cluase trong Posgres 9.5?

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lấy số hàng trong PostgreSQL

  2. Sử dụng ActiveRecord và Rails để chèn Dữ liệu vào cơ sở dữ liệu postgresql gặp lỗi này:RuntimeError:ERROR C22003 Minteger o

  3. ứng dụng khách postgresql tốt cho windows?

  4. Cài đặt PostGIS Homebrew tham chiếu đến một đường dẫn cũ?

  5. Nâng cấp lên PostgreSQL13