PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Zmartwiony transakcją

Zakładając tę ​​prostą tabelę:

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

Ta funkcja prawie 100% bezpieczne (patrz komentarze) dla jednoczesnych transakcji.:

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;

Zadzwoń:

SELECT f_upsert(2, 2);

Jest bardzo podobny do tego INSERT / SELECT sprawa z dodatkowymi wyjaśnieniami i linkami:

  • Czy SELECT lub INSERT w funkcji podatnej na wyścigi?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wzór na współczynnik korelacji Pearsona w SQL

  2. Tabela krzyżowa z dużą lub nieokreśloną liczbą kategorii

  3. Naturalny sort obsługujący duże liczby

  4. Zapowiedź repmgr 2.0

  5. Jak używać ANY zamiast IN w klauzuli WHERE w Railsach?