sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man korrekt gör upsert i postgres 9.5

ON CONFLICT konstruktion kräver en UNIQUE tvång att arbeta. Från dokumentationen på INSERT .. ON CONFLICT klausul :

Nu är frågan inte särskilt tydlig men du behöver förmodligen en UNIQUE begränsning på de 2 kolumnerna kombinerade:(category_id, gallery_id) .

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

Om raden som ska infogas matchar båda värden med en rad redan i tabellen, istället för INSERT , gör en 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 ;

Du kan använda antingen kolumnerna i UNIQUE-begränsningen:

  ON CONFLICT (category_id, gallery_id) 

eller begränsningsnamnet:

  ON CONFLICT ON CONSTRAINT category_gallery_uq  


  1. muterande, trigger/funktion kanske inte ser det-fel under exekvering av trigger

  2. Importera data från Excel-kalkylblad eller CVS till MySQL

  3. SQL Array-sökning

  4. UPPDATERA post i en databas med värden från en annan i SQL Server 2008?