Trong bài đăng này, tôi đang chia sẻ phần trình bày về cách viết câu lệnh hợp nhất bằng CTE của PostgreSQL.
PostgreSQL 9.1 có một tính năng mới để viết CTE và để sử dụng CTE, bạn cũng có thể hợp nhất INSERT / UPDATE trong một biểu thức.
Tuyên bố hợp nhất luôn là một điểm thảo luận cho các Nhà phát triển cơ sở dữ liệu của MySQL / PostgreSQL.
Dưới đây là minh họa đầy đủ để chèn bản ghi nếu không tồn tại và cập nhật bản ghi nếu chúng tồn tại.
Đầu tiên chúng ta hãy tạo một bảng mẫu:
1 2 3 4 5 | CREATE TABLE tbl_TestUpsert ( Rno INTEGER ,Name VARCHAR(100) ); |
Bây giờ hãy tạo một hàm được lưu trữ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | CREATE OR REPLACE FUNCTION fn_InserUpdateMergeDemo ( InputRno INTEGER ,InputName VARCHAR(100) ) RETURNS integer AS $BODY$ DECLARE BEGIN WITH to_be_upserted (Rno,Name) AS (VALUES(InputRno,InputName)) ,updated AS ( UPDATE tbl_TestUpsert SET Rno=InputRno,Name=InputName FROM to_be_upserted WHERE tbl_TestUpsert.Rno = to_be_upserted.Rno RETURNING tbl_TestUpsert.Rno ) INSERT INTO tbl_TestUpsert(Rno,Name) SELECT Rno,Name FROM to_be_upserted WHERE Rno NOT IN (SELECT Rno FROM updated); RETURN 0; EXCEPTION WHEN OTHERS THEN RAISE; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; |
Như bạn có thể thấy trong hàm trên, CTE được tạo với hai tham số đầu vào và hợp nhất INSERT / UPDATE bằng cách sử dụng một biểu thức.
Bây giờ hãy gọi hàm này với dữ liệu mẫu:
1 2 3 4 | SELECT *FROM fn_InserUpdateMergeDemo(1,'Anvesh'); SELECT *FROM fn_InserUpdateMergeDemo(2,'Neevan'); SELECT *FROM fn_InserUpdateMergeDemo(3,'Ronika'); SELECT *FROM fn_InserUpdateMergeDemo(2,'Roy'); |
Bạn có thể tìm thấy hai bản ghi có cùng cột rno và “Neevan” được cập nhật bởi “Roy”.
Kiểm tra kết quả này: