sql >> Databáze >  >> RDS >> PostgreSQL

Jak podmíněně UPDATE/INSERT po DELETE, které nenajde řádky?

Pokud DELETE nenajde žádný kvalifikující řádek, jeho RETURNING klauzule vrátí žádné řádky .

Název požaduje "podmíněně AKTUALIZOVAT/VLOŽIT po DELETE" , ale tělo si stěžuje, že "selže, pokud není k dispozici žádný řádek k odstranění" . Pokud podmínkou není existence řádku k odstranění, pak jaká je podmínka?

Jít ven na úd, to může buďte tím, čím chcete:

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

Smaže všechny řádky z tabulky outfit_garment pro dané UUID pak buď vloží nebo aktualizuje řádek v tabulce outfit a nakonec přidá nové řádky podrobností do tabulky outfit_garment . Jakékoli outfit_id předán v _garments jsou ignorovány.
Pak vrátí jeden řádek se všemi oděvy sloučenými do hodnoty JSON.



  1. 1052:Sloupec 'id' v seznamu polí je nejednoznačný

  2. Vložení více řádků do mysql

  3. Relace MySQL Workbench nevidí aktualizace databáze

  4. Proč je nejlepší uložit telefonní číslo jako řetězec vs. celé číslo?