सबसे पहले, एक क्रम जो एक सीरियल कॉलम के लिए स्वचालित रूप से बनाया जाता है स्वचालित रूप से हटा दिया जाता है , जब कॉलम (या वह तालिका जिसमें वह है) को हटा दिया जाता है। आप जिस समस्या का वर्णन कर रहे हैं वह प्रारंभ में मौजूद नहीं होनी चाहिए। केवल बहुत PostgreSQL के पुराने संस्करणों ने ऐसा नहीं किया। 7.4 या उससे अधिक?
समस्या का समाधान:
यह क्वेरी सभी "अनबाउंड" अनुक्रमों को हटाने के लिए डीडीएल कमांड उत्पन्न करेगी डेटाबेस में इसे निष्पादित किया जाता है:
SELECT string_agg('DROP SEQUENCE ' || c.oid::regclass, '; ') || ';' AS ddl
FROM pg_class c
LEFT JOIN pg_depend d ON d.refobjid = c.oid
AND d.deptype <> 'i'
WHERE c.relkind = 'S'
AND d.refobjid IS NULL;
regclass
. के लिए कास्ट करें c.oid::regclass
. में वर्तमान search_path
. के अनुसार जहां आवश्यक हो वहां स्वचालित रूप से स्कीमा-योग्य अनुक्रम नाम . देखें:
- कैसे जांचा जाए कि दी गई स्कीमा में कोई तालिका मौजूद है या नहीं
- खोज_पथ पहचानकर्ता संकल्प और "वर्तमान स्कीमा" को कैसे प्रभावित करता है
परिणाम:
DROP SEQUENCE foo_id_seq;
DROP SEQUENCE bar_id_seq;
...
उन सभी अनुक्रमों को छोड़ने के लिए परिणाम निष्पादित करें जो किसी सीरियल कॉलम (या किसी अन्य कॉलम) से बंधे नहीं हैं। यहां कॉलम और टेबल का अर्थ पढ़ें। ।
सावधान यद्यपि! यह नहीं . करता है इसका मतलब है कि वे क्रम अन्यथा उपयोग में नहीं हैं। ऐसे कई उपयोग मामले हैं जहां अनुक्रम स्टैंडअलोन ऑब्जेक्ट के रूप में बनाए जाते हैं। उदाहरण के लिए यदि आप चाहते हैं कि एक से अधिक कॉलम एक अनुक्रम साझा करें। आपको ठीक-ठीक पता होना चाहिए कि आप क्या कर रहे हैं।
हालांकि, आप नहीं एक serial
. के लिए बाध्य अनुक्रम हटाएं इस तरह स्तंभ। तो ऑपरेशन इस . में सुरक्षित है सम्मान।
DROP SEQUENCE test_id_seq
परिणाम:
ERROR: cannot drop sequence test_id_seq because other objects depend on it
DETAIL: default for table test column id depends on sequence test_id_seq
HINT: Use DROP ... CASCADE to drop the dependent objects too.