PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara UPDATE/INSERT secara kondisional setelah DELETE yang tidak menemukan baris?

Jika DELETE tidak menemukan baris yang memenuhi syarat, RETURNING klausa mengembalikan tidak ada baris .

Judul meminta untuk "dengan syarat UPDATE/INSERT setelah DELETE" , tetapi badan mengeluh "gagal jika tidak ada baris yang dihapus" . Jika keberadaan baris yang akan dihapus bukan syaratnya, lalu apa syaratnya?

Mengambil risiko, ini mungkin menjadi apa yang Anda inginkan:

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

Ini menghapus semua baris dari tabel outfit_garment untuk UUID yang diberikan, lalu menyisipkan atau memperbarui baris dalam tabel outfit , dan akhirnya menambahkan baris detail baru di tabel outfit_garment . outfit_id Any diteruskan di _garments diabaikan.
Kemudian ia mengembalikan satu baris dengan semua pakaian digabungkan menjadi nilai 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. Bergabunglah dengan 2 tabel di mana dua set angka tumpang tindih dalam kolom yang bergabung

  2. Postgres membuat Tabel dengan array kunci asing

  3. Kueri dengan LEFT JOIN tidak mengembalikan baris untuk hitungan 0

  4. PostgreSQL:DALAM SATU SINGLE SQL SYNTAX dengan nilai numerik yang dihitung dari kolom teks

  5. Bagaimana mengelola transaksi melalui beberapa database