pg_get_serial_sequence
अनुक्रम नाम के बारे में किसी भी गलत धारणा से बचने के लिए इस्तेमाल किया जा सकता है। यह एक शॉट में अनुक्रम को रीसेट करता है:
SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name)+1);
या अधिक संक्षेप में:
SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), MAX(id)) FROM table_name;
हालाँकि, यह फ़ॉर्म सही तालिकाओं को सही तरीके से नहीं संभाल सकता है, क्योंकि अधिकतम (आईडी) शून्य है, और न ही आप 0 को सेट कर सकते हैं क्योंकि यह अनुक्रम की सीमा से बाहर होगा। इसके लिए एक वर्कअराउंड ALTER SEQUENCE
सिंटैक्स का सहारा लेना है
ALTER SEQUENCE table_name_id_seq RESTART WITH 1;
ALTER SEQUENCE table_name_id_seq RESTART; -- 8.4 or higher
लेकिन ALTER SEQUENCE
सीमित उपयोग का है क्योंकि अनुक्रम नाम और पुनरारंभ मूल्य अभिव्यक्ति नहीं हो सकता है।
ऐसा लगता है कि सबसे अच्छा उद्देश्यपूर्ण समाधान setval
3 जी पैरामीटर के रूप में गलत के साथ कॉल करना है, जिससे हमें "उपयोग करने के लिए अगला मूल्य" निर्दिष्ट करने की अनुमति मिलती है:
SELECT setval(pg_get_serial_sequence('t1', 'id'), coalesce(max(id),0) + 1, false) FROM t1;
इससे मेरे सभी बॉक्स टिक हो गए:
- वास्तविक अनुक्रम नाम के हार्ड-कोडिंग से बचा जाता है
- खाली टेबल को सही तरीके से संभालता है
- मौजूदा डेटा के साथ तालिकाओं को संभालता है, और अनुक्रम में एक छेद नहीं छोड़ता है
अंत में, ध्यान दें कि pg_get_serial_sequence
स्तंभ के स्वामित्व में केवल अनुक्रम ही काम करता है। यह मामला होगा यदि वृद्धिशील स्तंभ को एक serial
प्रकार के रूप में परिभाषित किया गया था , हालांकि यदि अनुक्रम मैन्युअल रूप से जोड़ा गया था तो यह सुनिश्चित ALTER SEQUENCE .. OWNED BY
करना भी आवश्यक है कि प्रदर्शन भी किया जाए।
अर्थात यदि serial
टेबल निर्माण के लिए टाइप किया गया था, तो यह सब काम करना चाहिए:
CREATE TABLE t1 (
id serial,
name varchar(20)
);
SELECT pg_get_serial_sequence('t1', 'id'); -- returns 't1_id_seq'
-- reset the sequence, regardless whether table has rows or not:
SELECT setval(pg_get_serial_sequence('t1', 'id'), coalesce(max(id),0) + 1, false) FROM t1;
लेकिन अगर दृश्यों को मैन्युअल रूप से जोड़ा गया था:
CREATE TABLE t2 (
id integer NOT NULL,
name varchar(20)
);
CREATE SEQUENCE t2_custom_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE t2 ALTER COLUMN id SET DEFAULT nextval('t2_custom_id_seq'::regclass);
ALTER SEQUENCE t2_custom_id_seq OWNED BY t2.id; -- required for pg_get_serial_sequence
SELECT pg_get_serial_sequence('t2', 'id'); -- returns 't2_custom_id_seq'
-- reset the sequence, regardless whether table has rows or not:
SELECT setval(pg_get_serial_sequence('t2', 'id'), coalesce(max(id),0) + 1, false) FROM t1;