sql >> Database teknologi >  >> RDS >> PostgreSQL

Upsert med en transaktion

Forudsat denne simple tabel:

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

Denne funktion næsten 100 % sikker (se kommentarer) for samtidige transaktioner.:

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;

Ring til:

SELECT f_upsert(2, 2);

Den minder meget om denne INSERT / SELECT case med mere forklaring og links:

  • Er SELECT eller INSERT i en funktion, der er tilbøjelig til løbsforhold?



  1. Sådan aktiverer du SQL Server Agent XP'er ved hjælp af T-SQL

  2. Hvordan laver man en masseindsættelse i MySQL?

  3. Brug af CASE-udtryk i SQL Server

  4. Sådan eksporteres en database ved hjælp af phpMyAdmin