sql >> Database >  >> RDS >> PostgreSQL

Upsert met een transactie

Uitgaande van deze eenvoudige tabel:

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

Deze functie bijna 100% veilig (zie opmerkingen) voor gelijktijdige transacties.:

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;

Bel:

SELECT f_upsert(2, 2);

Het lijkt erg op deze INSERT / SELECT case met meer uitleg en links:

  • Is SELECT of INSERT in een functie die vatbaar is voor race-omstandigheden?



  1. Toegang verlenen tot v$ views (v$session ,v$instance)

  2. Fout 1033 ontvangen inloggen op de standby

  3. Hoe voorloopnullen van datums in Oracle te verwijderen

  4. Hoe 'ON DELETE CASCADE' toe te voegen in de ALTER TABLE-instructie