sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan kan man betinget OPDATERE/INDSÆTTE efter DELETE, der ikke finder rækker?

Hvis DELETE finder ingen kvalificerende række, dens RETURNING klausul returnerer ingen rækker .

Titlen beder om "betinget OPDATERING/INDSÆT efter SLETT" , men kroppen klager over det "mislykkes, hvis der ikke er nogen række at slette" . Hvis eksistensen af ​​en række, der skal slettes, ikke er betingelsen, hvad er betingelsen så?

Hvis du går ud på et ben, måske dette være hvad du vil:

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 sletter alle rækker fra tabellen outfit_garment for det givne UUID, indsætter eller opdaterer du derefter en række i tabellen outfit , og tilføjer endelig nye detaljerækker i tabel outfit_garment . Enhver outfit_id bestået i _garments ignoreres.
Derefter returnerer den en enkelt række med alle beklædningsgenstande slået sammen til en JSON-værdi.



  1. PostgreSQL - implementering af en pålidelig kø

  2. Hvordan indsætter man en række i postgreSQL pgAdmin?

  3. Adgang nægtet fejl fra Java til MySQL

  4. SQL Server Konverter heltal til binær streng