sql >> Database >  >> RDS >> PostgreSQL

Hoe voorwaardelijk UPDATE/INSERT na DELETE die geen rijen vindt?

Als de DELETE vindt geen kwalificerende rij, het is RETURNING clausule retourneert geen rijen .

De titel vraagt ​​om "voorwaardelijk UPDATE/INSERT after DELETE" , maar het lichaam klaagt dat het "mislukt als er geen rij is om te verwijderen" . Als het bestaan ​​van een rij om te verwijderen niet de voorwaarde is, wat is dan de voorwaarde?

Uitgaan op een ledemaat, dit misschien wees wat je wilt:

CREATE FUNCTION updateoutfit(_id UUID, _title text DEFAULT NULL::text, _garments json)
  RETURNS TABLE (id UUID, title text, garments json)
  LANGUAGE sql AS
$func$
DELETE FROM outfit_garment WHERE outfit_id = _id;  -- DELETE if exists

INSERT INTO outfit (id, title)  -- UPSERT outfit
VALUES (_id, _title)
ON CONFLICT (id) DO UPDATE
SET    title = EXCLUDED.title;
   
WITH ins AS (  -- INSERT new rows in outfit_garment
   INSERT INTO outfit_garment (position_x, outfit_id)
   SELECT "positionX", _id
   FROM   json_to_recordset(_garments) AS x("positionX" float)  -- outfit_id UUID was unused!
   RETURNING json_build_object('positionX', position_x) AS garments
   )
SELECT _id, _title, json_agg(garments)
FROM   ins
GROUP  BY id, title;
$func$;

Het verwijdert alle rijen uit tabel outfit_garment voor de gegeven UUID, voegt of updatet dan een rij in tabel outfit , en voegt ten slotte nieuwe detailrijen toe in tabel outfit_garment . Elke outfit_id doorgegeven in _garments worden genegeerd.
Vervolgens retourneert het een enkele rij met alle kledingstukken samengevoegd tot een JSON-waarde.



  1. Verschil tussen huidige en vorige tijdstempel

  2. GitHub-acties:verbinding maken met Postgres in GithHub-acties

  3. SQL-query's 00904. 00000 - %s:ongeldige id

  4. PostgreSQL, min, max en aantal datums binnen bereik