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

Upser dengan transaksi

Dengan asumsi tabel sederhana ini:

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

Fungsi ini hampir 100% aman (lihat komentar) untuk transaksi bersamaan.:

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;

Telepon:

SELECT f_upsert(2, 2);

Ini sangat mirip dengan INSERT / SELECT ini kasus dengan lebih banyak penjelasan dan tautan:

  • Apakah SELECT atau INSERT dalam fungsi rentan terhadap kondisi balapan?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan PostgreSQL untuk menghitung/mengelompokkan berdasarkan hari dan menampilkan hari tanpa data

  2. Cegah pemicu rekursif di PostgreSQL

  3. Python psycopg2 tidak dimasukkan ke dalam tabel postgresql

  4. Menggunakan Kubernetes untuk Menerapkan PostgreSQL

  5. Kesalahan sintaks tabel drop postgres