PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak warunkowo UPDATE/INSERT po DELETE, który nie znajduje wierszy?

Jeśli DELETE nie znajduje żadnego kwalifikującego się wiersza, jego RETURNING klauzula zwraca brak wierszy .

Tytuł prosi o „warunkową aktualizację/wstawienie po usunięciu” , ale ciało skarży się, że „nie powiedzie się, jeśli nie ma wiersza do usunięcia” . Jeśli istnienie wiersza do usunięcia nie jest warunkiem, to jaki jest warunek?

Wychodząc na kończynę, to może bądź kim chcesz:

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

Usuwa wszystkie wiersze z tabeli outfit_garment dla danego UUID, a następnie wstawia lub aktualizuje wiersz w tabeli outfit , a na koniec dodaje nowe wiersze szczegółów w tabeli outfit_garment . Dowolny outfit_id przekazane w _garments są ignorowane.
Następnie zwraca pojedynczy wiersz ze wszystkimi ubraniami połączonymi w wartość JSON.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. usuń kolumnę nie istnieje

  2. Jak przyspieszyć działanie Pythona / PostgreSQL?

  3. Czy w PostgreSQL wiele UPDATE różnych wierszy w tej samej tabeli ma sprzeczne blokady?

  4. Komentować znak/znaki w postgres / postgresql / psql?

  5. Naturalny sort obsługujący duże liczby