PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

लेन-देन के साथ अप्सर्ट

इस साधारण तालिका को मानते हुए:

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 . से मिलता-जुलता है अधिक स्पष्टीकरण और लिंक के साथ मामला:

  • क्या किसी ऐसे फंक्शन में 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. कॉलम निर्दिष्ट किए बिना SQL INSERT। क्या होता है?

  2. PostgreSQL में क्वेरी परिणामों को कैसे फ़िल्टर करें

  3. PostgreSQL में आंकड़े लक्ष्य जांचें

  4. कैसे Asind () PostgreSQL में काम करता है

  5. बहु-आयामी सरणी को एकत्रित करने के लिए फ़ंक्शन में प्रारंभिक सरणी