2011-07-04 16 views
12

मुझे एक स्क्रिप्ट मिलती है जो एक डीबी से दूसरे डेटा तालिका की प्रतिलिपि बनाता है, हालांकि आईडी कॉलम को अनुक्रम द्वारा समर्थित किया जाता है, जब गंतव्य तालिका में नया रिकॉर्ड डाला जाता है nextval(seq) गलत मूल्य वापस कर रहा है।पुनरारंभ करें ताकि अगली बार अगली अप्रयुक्त आईडी

मुझे अनुक्रम को अपडेट करने की आवश्यकता है ताकि यह अगले उपलब्ध आईडी पर शुरू हो।

ALTER SEQUENCE seq_id RESTART WITH 
    (SELECT MAX(id) FROM tbl); 

ऊपर एक सिंटैक्स त्रुटि तथापि पैदा करता है:

मैं की तरह कुछ करना चाहते हैं।

क्या कोई वैकल्पिक दृष्टिकोण सुझा सकता है?

उत्तर

9
DO $$ 
    SELECT INTO m MAX(id) FROM tbl; 
    EXECUTE 'ALTER SEQUENCE seq_id RESTART WITH ' || m; 
END$$; 

या, बेहतर अभी तक, इस सवाल देखें:

+0

जवाब के लिए धन्यवाद, मैं इस चल रहा हूँ के रूप में एक गूंज psql में पहुंचाया .. आप मुझे बता सकते पूरे आदेश से कैसे बचें? – pstanton

+0

गतिशील रूप से 'परिवर्तन अनुक्रम' कथन बनाने के बजाय आप 'सेटवल' फ़ंक्शन का उपयोग कर सकते हैं; सरल, लेकिन यदि आप इन्हें एक-एक करके कर रहे हैं तो कोई वास्तविक अंतर नहीं आता है। – araqnid