PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie kann man nach DELETE, das keine Zeilen findet, bedingt UPDATE/INSERT?

Wenn der DELETE findet keine qualifizierende Zeile, ihr RETURNING -Klausel gibt keine Zeilen zurück .

Der Titel verlangt nach "bedingtem UPDATE/INSERT nach DELETE" , aber der Körper beschwert sich, dass es "fehlschlägt, wenn es keine zu löschende Zeile gibt" . Wenn das Vorhandensein einer zu löschenden Zeile nicht die Bedingung ist, dann was ist die Bedingung?

Auf die Beine gehen, das könnte sei, was du willst:

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$;

Es löscht alle Zeilen aus der Tabelle outfit_garment für die gegebene UUID, fügt dann entweder eine Zeile in die Tabelle outfit ein oder aktualisiert sie , und fügt schließlich neue Detailzeilen in der Tabelle outfit_garment hinzu . Beliebige outfit_id _garments übergeben werden ignoriert.
Dann wird eine einzelne Zeile zurückgegeben, in der alle Kleidungsstücke zu einem JSON-Wert zusammengefasst sind.