PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara Mengambil id dari baris yang disisipkan saat menggunakan upsert dengan WITH cluse di Posgres 9.5?

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan fungsi jendela OVER di SQLAlchemy

  2. Keluarkan atau ekstrak stempel waktu dari v1 UUID di PostgreSQL

  3. Liquibase + Postgresql + Spring Jpa :Id masalah kenaikan otomatis

  4. Oracle ke PostgreSQL:MULAI DENGAN/HUBUNGKAN OLEH

  5. Ekstrak hari kerja, milidetik, mikrodetik, nanodetik dari tanggal di Postgres