PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como UPDATE/INSERT condicionalmente após DELETE que não encontra linhas?


Se o DELETE não encontra nenhuma linha qualificada, seu RETURNING cláusula retorna nenhuma linha .

O título pede para "ATUALIZAR/INSERIR condicionalmente após DELETE" , mas o corpo reclama que "falha se não houver linha para excluir" . Se a existência de uma linha a ser excluída não for a condição, qual é a condição?

Sair em um membro, isso pode seja o que você quiser:
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$;

Ele exclui todas as linhas da tabela outfit_garment para o UUID fornecido, insere ou atualiza uma linha na tabela outfit , e finalmente adiciona novas linhas de detalhes na tabela outfit_garment . Qualquer outfit_id passado em _garments são ignorados.
Em seguida, ele retorna uma única linha com todas as roupas amalgamadas em um valor JSON.