PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment faire correctement upsert dans postgres 9.5

Le ON CONFLICT la construction nécessite un UNIQUE contrainte de travailler. À partir de la documentation sur INSERT .. ON CONFLICT clause :

Maintenant, la question n'est pas très claire mais vous avez probablement besoin d'un UNIQUE contrainte sur les 2 colonnes combinées :(category_id, gallery_id) .

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

Si la ligne à insérer correspond aux les deux valeurs avec une ligne déjà sur la table, puis au lieu de INSERT , faites une 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 ;

Vous pouvez utiliser soit les colonnes de la contrainte UNIQUE :

  ON CONFLICT (category_id, gallery_id) 

ou le nom de la contrainte :

  ON CONFLICT ON CONSTRAINT category_gallery_uq