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

ऑटोइनक्रिकमेंट, लेकिन कॉलम में मौजूदा मानों को छोड़ दें

अपडेट करें:बाद में, अधिक विस्तृत उत्तर:

यह सुचारू रूप से काम करना चाहिए:

CREATE OR REPLACE FUNCTION f_next_free(_seq regclass)
  RETURNS integer AS
$func$
BEGIN
   LOOP
      PERFORM nextval(_seq);
      EXIT WHEN NOT EXISTS (SELECT 1 FROM db.t1 WHERE id = lastval());
   END LOOP; 

   RETURN lastval();
END
$func$  LANGUAGE plpgsql VOLATILE;

लूप अगले नंबर को दिए गए क्रम से तब तक प्राप्त कर रहा है जब तक कि कोई ऐसा नहीं मिल जाता जो अभी तक तालिका में नहीं है। समवर्ती उपयोग के लिए सुरक्षित . भी होना चाहिए , क्योंकि हम अभी भी एक अनुक्रम पर निर्भर हैं।

सीरियल कॉलम के कॉलम डिफॉल्ट में इस फ़ंक्शन का उपयोग करें (सीरियल कॉलम के लिए डिफ़ॉल्ट की जगह nextval('t1_id_seq'::regclass) :

ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);

मैनुअल ऑन लास्टवाल()

यह कुछ द्वीपों और कई अंतरालों के साथ अच्छा प्रदर्शन करता है (जो उदाहरण के अनुसार ऐसा प्रतीत होता है)। लागू करने के लिए विशिष्टता, एक अद्वितीय बाधा जोड़ें (या प्राथमिक कुंजी) कॉलम पर।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. रिलेशनल डेटाबेस में बड़े स्ट्रिंग फ़ील्ड का संपादन इतिहास कैसे रखें?

  2. क्वेरी से ऑब्जेक्ट निकालें यदि कोई नहीं या शून्य

  3. odoo12 डेटाबेस बैकअप कोई मालिक नहीं है?

  4. Postgresql कॉन्फ़िग फ़ाइल कहाँ है:विंडोज़ पर 'postgresql.conf'?

  5. इसका क्या मतलब है जब एक PostgreSQL प्रक्रिया लेनदेन में निष्क्रिय है?