PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come eseguire correttamente upsert in postgres 9.5

Il ON CONFLICT costrutto richiede un UNIQUE costrizione a lavorare. Dalla documentazione su INSERT .. ON CONFLICT clausola :

Ora, la domanda non è molto chiara ma probabilmente hai bisogno di un UNIQUE vincolo sulle 2 colonne combinate:(category_id, gallery_id) .

ALTER TABLE category_gallery
    ADD CONSTRAINT category_gallery_uq
    UNIQUE (category_id, gallery_id) ;

Se la riga da inserire corrisponde a entrambi valori con una riga già nella tabella, quindi al posto di INSERT , esegui un UPDATE :

INSERT INTO category_gallery (
  category_id, gallery_id, create_date, create_by_user_id
  ) VALUES ($1, $2, $3, $4)
  ON CONFLICT (category_id, gallery_id)
  DO UPDATE SET
    last_modified_date = EXCLUDED.create_date,
    last_modified_by_user_id = EXCLUDED.create_by_user_id ;

Puoi utilizzare entrambe le colonne del vincolo UNIQUE:

  ON CONFLICT (category_id, gallery_id) 

o il nome del vincolo:

  ON CONFLICT ON CONSTRAINT category_gallery_uq