PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Nâng cấp với một giao dịch

Giả sử bảng đơn giản này:

CREATE TABLE tbl(id int primary key, value int);

Chức năng này gần như 100% an toàn (xem phần bình luận) cho các giao dịch đồng thời.:

CREATE OR REPLACE FUNCTION f_upsert(_id int, _value int)
  RETURNS void AS
$func$
BEGIN
LOOP
   UPDATE tbl SET value = _value WHERE  id = _id;

   EXIT WHEN FOUND;

   BEGIN
      INSERT INTO tbl (id, value)
      VALUES (_id, _value);

      RETURN;

   EXCEPTION WHEN UNIQUE_VIOLATION THEN     -- tbl.id has UNIQUE constraint.
      RAISE NOTICE 'It actually happened!'; -- hardly ever happens
   END;

END LOOP;
END
$func$ LANGUAGE plpgsql;

Gọi:

SELECT f_upsert(2, 2);

Nó rất giống với INSERT / SELECT này trường hợp với giải thích thêm và liên kết:

  • CHỌN hoặc CHÈN trong một hàm có nguy cơ gặp phải các điều kiện về chủng tộc không?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi Tập hợp kết quả từ Mảng SQL thành Mảng chuỗi

  2. chuyển đổi định dạng hình học Postgres sang WKT

  3. Khóa ngoại của một trong nhiều bảng?

  4. Triển khai Django + Python 3 + PostgreSQL lên AWS Elastic Beanstalk

  5. ĐẶT HÀNG ĐƯỢC lập chỉ mục theo LIMIT 1