PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да извлека id на вмъкнат ред, когато използвам upsert с WITH cluase в Posgres 9.5?

Не ми беше ясно защо правите при WITH първо SELECT, но причината да получите само връщане на UPDATE id е, защото не избирате INSERT return.

Както беше споменато (и свързано) в коментарите, Postgres 9.5 поддържа клауза INSERT ON CONFLICT, която е много по-чист начин за използване.

И някои примери преди и след 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 .. 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;

АКТУАЛИЗАЦИЯ:

Както беше намекнато в коментар, може да има леки недостатъци при използването на INSERT .. ON CONFLICT начин.
В случай, че таблицата използва автоматично нарастване и тази заявка се случва често, тогава WITH може да е по-добър вариант.
Вижте още: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. Превключване/Обратно превключване в Slony-I при надграждане на основните версии на PostgreSQL 8.4.x/9.3.x

  2. Последователността не се нулира след съкращаване на таблицата

  3. Има ли опции за таблица за присъединяване за асоциации много към много?

  4. Как да зададете схема в pg-promise

  5. Създайте индекс на json поле в PostgreSQL 9.2