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