मैंने निम्नलिखित कोशिश की है, लेकिन मैं असफल रहा:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
मैंने निम्नलिखित कोशिश की है, लेकिन मैं असफल रहा:
ALTER TABLE person ALTER COLUMN dob POSITION 37;
जवाबों:
PostgreSQL विकी में " ऑल्टर कॉलम पोजिशन " कहती है:
PostgreSQL वर्तमान
attnum
मेंpg_attribute
तालिका के स्तंभ के आधार पर स्तंभ क्रम को परिभाषित करता है । कॉलम ऑर्डर को बदलने का एकमात्र तरीका या तो तालिका को फिर से बनाना है, या जब तक आप वांछित लेआउट तक नहीं पहुंचते हैं, तब तक कॉलम और घूर्णन डेटा जोड़कर।
यह बहुत कमज़ोर है, लेकिन उनके बचाव में, मानक एसक्यूएल में, किसी कॉलम को रिपॉज़िट करने का कोई समाधान नहीं है। डेटाबेस ब्रांड जो स्तंभ की क्रमिक स्थिति को बदलने का समर्थन करते हैं, SQL सिंटैक्स के विस्तार को परिभाषित करते हैं।
एक अन्य विचार मेरे साथ होता है: आप VIEW
आधार तालिका में स्तंभ की भौतिक स्थिति को बदलने के बिना स्तंभों के क्रम को निर्दिष्ट कर सकते हैं कि आप इसे कैसे पसंद करते हैं।
PostgreSQL में, एक फ़ील्ड जोड़ते समय इसे तालिका के अंत में जोड़ा जाएगा। अगर हमें विशेष स्थिति में सम्मिलित करने की आवश्यकता है तो
alter table tablename rename to oldtable;
create table tablename (column defs go here);
insert into tablename (col1, col2, col3) select col1, col2, col3 from oldtable;
यह पोस्ट पुरानी है और शायद हल हो गई है लेकिन मेरे पास एक ही मुद्दा था। मैंने नए स्तंभ क्रम को निर्दिष्ट करते हुए मूल तालिका का एक दृश्य बनाकर इसे हल किया।
यहाँ से मैं या तो दृश्य का उपयोग कर सकता था या दृश्य से एक नई तालिका बना सकता था।
क्रिएट व्यू ओरिजिनल_टैब_वीडब्ल्यू एएस A.col1, a.col3, a.col4, a.col2 का चयन करें मूल_तब से जहां भी a.col1 है, जो भी पूरा नहीं है
सेलेक्ट * INTO new_table से original_tab_vw
मूल तालिका का नाम बदलें या छोड़ें और नई तालिका का नाम पुरानी तालिका पर सेट करें।
एक, स्तम्भों को पुनर्व्यवस्थित करने के लिए एक अनाड़ी विकल्प के साथ, जब स्तंभ क्रम बिल्कुल बदला जाना चाहिए, और विदेशी कुंजी उपयोग में है, पहले डेटा के साथ पूरे डेटाबेस को डंप करना है, फिर बस स्कीमा ( pg_dump -s databasename > databasename_schema.sql
) को डंप करें । इसके बाद कॉलम को फिर से व्यवस्थित करने के लिए स्कीमा फ़ाइल को संपादित करें, फिर आप डेटाबेस को स्कीमा से फिर से बनाएँ, और अंत में नए बनाए गए डेटाबेस में डेटा को पुनर्स्थापित करें।
मुझे नहीं लगता कि आप वर्तमान में कर सकते हैं: Postgresql विकि पर इस लेख को देखें ।
इस लेख के तीन वर्कअराउंड हैं:
PGAdmin में तालिका खोलें और तल पर SQL फलक में SQL बनाएँ तालिका कथन की प्रतिलिपि बनाएँ। फिर Query Tool खोलें और पेस्ट करें। यदि तालिका में डेटा है, तो तालिका का नाम बदलकर 'new_name' करें, यदि नहीं, तो ड्रॉप टेबल लाइन में टिप्पणी "-" को हटा दें। आवश्यकतानुसार स्तंभ क्रम संपादित करें। यदि आपने इसे स्थानांतरित किया है, तो अंतिम कॉलम में अनुपलब्ध / शानदार अल्पविराम का ध्यान रखें। नए SQL बनाएँ तालिका आदेश निष्पादित करें। ताज़ा करें और ... voilà।
डिजाइन चरण में खाली तालिकाओं के लिए यह विधि काफी व्यावहारिक है।
यदि तालिका में डेटा है, तो हमें डेटा के कॉलम अनुक्रम को भी पुनर्व्यवस्थित करने की आवश्यकता है। यह आसान है: INSERT
अपने नए संस्करण में पुरानी तालिका को आयात करने के लिए उपयोग करें:
INSERT INTO new ( c2, c3, c1 ) SELECT * from old;
... जहां c2
, c3
, c1
स्तंभ हैं c1
, c2
, c3
अपने नए पदों में पुराने तालिका के। कृपया ध्यान दें कि इस मामले में आपको संपादित 'पुरानी' तालिका के लिए एक 'नए' नाम का उपयोग करना होगा , या आप अपना डेटा खो देंगे । यदि स्तंभ के नाम कई हैं, तो एक पाठ संपादक में नई तालिका संरचना की प्रतिलिपि बनाने के लिए लंबे और / या जटिल एक ही विधि का उपयोग करते हैं, और INSERT
बयान में प्रतिलिपि करने से पहले नया कॉलम सूची बनाएं ।
यह जांचने के बाद कि सब कुछ ठीक है, DROP
पुरानी तालिका और 'नया' नाम बदलकर 'पुरानी' का उपयोग करना ALTER TABLE new RENAME TO old;
और आप कर चुके हैं।
मैं बहुत सारी टेबलों को फिर से ऑर्डर करने पर काम कर रहा था और मैं नहीं चाहता था कि मैं एक ही तरह के सवाल लिखूं और इसलिए मैंने एक स्क्रिप्ट बनाई जो यह सब मेरे लिए कर सके। अनिवार्य रूप से, यह:
pg_dump
pg_dump
डेटा के साथ री-ऑर्डर की गई तालिका बनाने के लिए मूल क्वेरी को संशोधित करता हैइसका उपयोग निम्नलिखित सरल कमांड चलाकर किया जा सकता है:
./reorder.py -n schema -d database table \
first_col second_col ... penultimate_col ultimate_col --migrate
यह sql को प्रिंट करता है ताकि आप इसे सत्यापित कर सकें और इसका परीक्षण कर सकें, यह एक बड़ा कारण था जिसके आधार पर मैंने इसे बनाया pg_dump
। आप यहाँ जीथब रेपो पा सकते हैं ।
यदि आप सिरदर्द नहीं चाहते हैं तो मैं Django का उपयोग करता हूं और प्रत्येक तालिका में आईडी कॉलम की आवश्यकता होती है। दुर्भाग्य से, मैं लापरवाह था और मेरी तालिका bp.geo_location_vague में यह फ़ील्ड शामिल नहीं था। मैंने छोटी चाल की शुरुआत की। चरण 1:
CREATE VIEW bp.geo_location_vague_vw AS
SELECT
a.id, -- I change order of id column here.
a.in_date,
etc
FROM bp.geo_location_vague a
चरण 2: (बिना तालिका बनाए - तालिका स्वचालितता बनाएगी!)
SELECT * into bp.geo_location_vague_cp2 FROM bp.geo_location_vague_vw
चरण 3:
CREATE SEQUENCE bp.tbl_tbl_id_seq;
ALTER TABLE bp.geo_location_vague_cp2 ALTER COLUMN id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE bp.tbl_tbl_id_seq OWNED BY bp.geo_location_vague_cp2.id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(id), 0)) FROM bp.geo_location_vague_cp2;
क्योंकि मुझे टेबल में बिगसेरियस स्यूडोटाइप है। SELECT * के बाद pg में bigint टाइप insetad bigserial बनाएगा।
चरण 4: अब हम दृश्य को छोड़ सकते हैं, स्रोत तालिका छोड़ सकते हैं और पुराने नाम में नई तालिका का नाम बदल सकते हैं। चाल सफलतापूर्वक समाप्त हो गई थी।
इसे संभव बनाने के लिए कुछ समाधान हैं:
पूरी तालिका को फिर से बनाना
करंट टेबल के भीतर नए कॉलम बनाएं
एक दृश्य बनाएँ