sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man villkorligt UPPDATERA/INSERT efter DELETE som inte hittar rader?

Om DELETE hittar ingen kvalificerande rad, dess RETURNING sats returnerar inga rader .

Titeln frågar om att "villkorligt UPPDATERA/INSERT efter DELETE" , men kroppen klagar på att det "misslyckas om det inte finns någon rad att radera" . Om förekomsten av en rad att radera inte är villkoret, vilket är då villkoret?

Att gå ut på en gren, det här kan vara vad du vill:

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

Den tar bort alla rader från tabellen outfit_garment för det givna UUID, infogar eller uppdaterar sedan en rad i tabellen outfit , och lägger slutligen till nya detaljrader i tabellen outfit_garment . Alla outfit_id skickas i _garments ignoreras.
Då returnerar den en enda rad med alla plagg sammanslagna till ett JSON-värde.



  1. virtualenv som kan hitta flyttade bibliotek (som mysqlclient lib för MySQLdb)

  2. Ta reda på om en sträng bara innehåller ASCII-tecken

  3. ta bort dubbletter i sql och ändra relationstabellen därefter

  4. Sammansatt ELLER SQL-fråga (fråga #1 med WITH) och (fråga #2) med COUNT() ursäkter