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

Comment mettre à jour/insérer conditionnellement après DELETE qui ne trouve pas de lignes ?

Si le DELETE ne trouve aucune ligne qualifiante, son RETURNING la clause renvoie aucune ligne .

Le titre demande de "METTRE À JOUR/INSÉRER conditionnellement après SUPPRIMER" , mais le corps se plaint qu'il "échoue s'il n'y a pas de ligne à supprimer" . Si l'existence d'une ligne à supprimer n'est pas la condition, alors quelle est la condition ?

Sortir sur une branche, cela pourrait sois ce que tu veux :

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

Il supprime toutes les lignes de la table outfit_garment pour l'UUID donné, insère ou met à jour une ligne dans la table outfit , et enfin ajoute de nouvelles lignes de détail dans la table outfit_garment . Tout outfit_id passé en _garments sont ignorés.
Ensuite, il renvoie une seule ligne avec tous les vêtements fusionnés en une valeur JSON.