PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Upsert с транзакция

Ако приемем тази проста таблица:

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

Тази функция почти 100% сигурен (виж коментарите) за едновременни транзакции.:

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;

Обадете се:

SELECT f_upsert(2, 2);

Много е подобен на този INSERT / SELECT случай с повече обяснения и връзки:

  • Изберете или INSERT във функция предразположени ли са условия на състезание?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Съветни заключване или NOWAIT, за да избегнете чакането на заключени редове?

  2. Как да получите вчерашната дата в PostgreSQL

  3. Намерете зависими обекти за таблица или изглед

  4. Колко дисково пространство е необходимо за съхраняване на стойност NULL с помощта на postgresql DB?

  5. Heroku psql:ФАТАЛНО:останалите слотове за връзка са запазени за връзки на суперпотребител без репликация