PostgreSQL प्राथमिक कुंजी को 1 पर रीसेट करें


82

क्या कोई तरीका है कि एक आबादी वाले टेबल पर 1 फिर से शुरू करने के लिए PostgreSQL टेबल की प्राथमिक कुंजी को रीसेट करें?

अभी यह 1000000 और ऊपर से नंबर जेनरेट कर रहा है। मैं चाहता हूं कि मेरे सभी मौजूदा डेटा को बरकरार रखते हुए यह सभी रीसेट और 1 पर शुरू हो।

जवाबों:


34

यहां एक बेहतर विकल्प देखें: https://stackoverflow.com/a/5272164/5190

प्राथमिक कुंजियाँ जो ऑटोइन्क्रिमेंट (यानी, डेटा प्रकार वाले कॉलम serial primary key) एक अनुक्रम से जुड़ी हुई हैं । आप setval(<seqname>, <next_value>)फ़ंक्शन का उपयोग करके किसी भी अनुक्रम के लिए अगला मान सेट कर सकते हैं । ध्यान दें कि वास्तव में फ़ंक्शन को अपने आप से निष्पादित करने की आवश्यकता है SELECT, जैसे कि:SELECT setval(<seqname>, <next_value>)

सीरियल का उपयोग करते समय ऑटो के नाम ने अनुक्रम बनाए <table>_<column>_seq


14
आपको कॉल के सामने "SELECT" डालने की आवश्यकता है, जैसेSELECT setval('table_id_seq', 10000)
टॉम

4
अगर मैं करता हूं SELECT setval('table_id_seq', 1), जब मैं एक नया रिकॉर्ड डालता हूं तो आईडी 1 के बजाय वैल्यू 2 लेता है। पावेल गोसिक्की का समाधान काम करता है। (पोस्टग्रेक्यूएस 9.3)
ब्लू '

@ स्पष्ट रूप से क्या हुआ कि नई प्राथमिक कुंजी सौंपे जाने से पहले अनुक्रम संख्या बढ़ाई गई है, अर्थात। आपको इसे 0. पर रीसेट करना होगा। लेकिन मैं मानता हूं कि अन्य समाधान वैसे भी बेहतर है।
क्राल्यक

189

नंबर 1 के साथ वापस शुरू करने के लिए एक अनुक्रम को रीसेट करने का सबसे अच्छा तरीका निम्नलिखित को निष्पादित करना है:

ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1

इसलिए, usersतालिका के लिए उदाहरण के लिए यह होगा:

ALTER SEQUENCE users_id_seq RESTART WITH 1

21
WITH 1पैरामीटर redundand है और यह ommited किया जा सकता है
जेसेक क्रावक्ज़क

यह एकमात्र सही उत्तर है क्योंकि यह वास्तव में अनुक्रम को रीसेट करता है।
बाल्बिनेटर

1
बड़ी समस्या स्वचालित रूप से तालिका खंड बनाएँ द्वारा उत्पन्न अनुक्रमित पर, कि हम नाम पता नहीं है (और प्रत्यय नहीं है seq, द्वारा कर सकते हैं pkआदि।) ... लेकिन यह द्वारा psql पर द्वारा आसान है \d my_table_name। या SQL द्वारा जांच करें,SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
पीटर क्रूस

3

@ क्लू वास्तव में एक ऑटो-इन्क्रिमेंट प्राइमरी की का उपयोग करके एक नया रिकॉर्ड सम्मिलित कर रहा है, ठीक उसी तरह एक क्रम का उपयोग करने जैसा है:

INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)

इसलिए, यदि आप चाहते हैं कि पहली आईडी 1 हो, तो आपको अपना अनुक्रम 0 पर सेट करना होगा। लेकिन यह सीमा से बाहर है, इसलिए आपको ALTER SEQUECE स्टेटमेंट का उपयोग करना चाहिए। इसलिए, यदि आपके पास छूट के लिए आपके टेबल मेनू में क्रम संख्या नाम का सीरियल फ़ील्ड है:

ALTER SEQUENCE menu_number_seq RESTART

पूरी तरह से काम कर देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.