Nếu DELETE
không tìm thấy hàng nào đủ điều kiện, RETURNING
của nó mệnh đề trả về không có hàng .
Tiêu đề yêu cầu "CẬP NHẬT / CHÈN có điều kiện sau khi XÓA" , nhưng cơ thể phàn nàn rằng "không thành công nếu không có hàng nào để xóa" . Nếu sự tồn tại của một hàng cần xóa không phải là điều kiện, thì điều kiện là gì?
Đi chơi bằng tay chân, điều này có thể là những gì bạn muốn:
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$;
Nó xóa tất cả các hàng khỏi bảng outfit_garment
cho UUID đã cho, sau đó chèn hoặc cập nhật một hàng trong bảng outfit
và cuối cùng thêm các hàng chi tiết mới trong bảng outfit_garment
. Bất kỳ outfit_id
nào được chuyển vào _garments
bị bỏ qua.
Sau đó, nó trả về một hàng duy nhất với tất cả hàng may mặc được kết hợp thành một giá trị JSON.