PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

सीरियल से पहचान में टेबल आईडी कैसे बदलें?

BEGIN;
ALTER TABLE public.client ALTER clientid DROP DEFAULT; -- drop default

DROP SEQUENCE public.client_clientid_seq;              -- drop owned sequence

ALTER TABLE public.client
-- ALTER clientid SET DATA TYPE int,                   -- not needed: already int
   ALTER clientid ADD GENERATED ALWAYS AS IDENTITY (RESTART 108);
COMMIT;

दो चर हैं:

  • संलग्न का वास्तविक नाम SEQUENCE . मैंने उपरोक्त डिफ़ॉल्ट नाम का उपयोग किया है, लेकिन नाम भिन्न हो सकता है।
  • client.clientid में वर्तमान अधिकतम मान . 107 होना जरूरी नहीं है, सिर्फ इसलिए कि वर्तमान में 107 पंक्तियां हैं।

इस क्वेरी को दोनों मिलते हैं:

SELECT pg_get_serial_sequence('client', 'clientid'), max(clientid) FROM client;

एक serial कॉलम एक integer है कॉलम जिसका स्वामित्व है एक समर्पित अनुक्रम और इसका डिफ़ॉल्ट सेट इसे से आकर्षित करने के लिए है (जैसा कि आपके द्वारा पोस्ट की गई तालिका परिभाषा से देखा जा सकता है)। इसे एक सादा integer बनाने के लिए , डिफ़ॉल्ट ड्रॉप करें और फिर अनुक्रम ड्रॉप करें।

कॉलम को IDENTITY में कनवर्ट करना अपना क्रम जोड़ता है। आपको जरूरी पुराने स्वामित्व वाले अनुक्रम को छोड़ दें (या कम से कम स्वामित्व, जो अनुक्रम को छोड़ने के साथ मर जाता है)। अन्यथा आपको त्रुटियाँ मिलती हैं जैसे:

एक तालिका की संरचना और सामग्री की प्रतिलिपि कैसे करें, लेकिन अलग अनुक्रम के साथ?

फिर सादे integer . को रूपांतरित करें एक IDENTITY . के लिए कॉलम कॉलम, और वर्तमान अधिकतम प्लस 1 . के साथ पुनरारंभ करें . आपको जरूरी अद्वितीय उल्लंघनों से बचने के लिए नए आंतरिक अनुक्रम का वर्तमान मान सेट करें।

यह सब एक ही लेन-देन में लपेटें, ताकि आप माइग्रेशन में आधे रास्ते में गड़बड़ न करें। ये सभी डीडीएल कमांड पोस्टग्रेज में ट्रांजेक्शनल हैं, प्रतिबद्ध होने तक वापस रोल किए जा सकते हैं और इसके बाद शुरू होने वाले अन्य लेनदेन के लिए ही दृश्यमान हैं।

आपका कॉलम पहले पीके था और पीके रहता है। यह परिवर्तन के लिए ओर्थोगोनल है।

(पोस्टग्रेज 10 में नया) IDENTITY के प्रमुख लेखक पीटर एसेंट्राउट सुविधा, एक फ़ंक्शन upgrade_serial_to_identity() . भी प्रदान करता है मौजूदा serial . को परिवर्तित करने के लिए स्तंभ। यह मौजूदा अनुक्रम का पुन:उपयोग करता है और इसके बजाय सिस्टम कैटलॉग को सीधे अपडेट करता है - जो आपको स्वयं नहीं करना चाहिए जब तक कि आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं। इसमें विदेशी कोने के मामले भी शामिल हैं। इसे देखें (अध्याय "अपग्रेडिंग"):

हालांकि, फ़ंक्शन अधिकांश होस्ट की गई सेवाओं पर काम नहीं करेगा जो सिस्टम कैटलॉग के सीधे हेरफेर की अनुमति नहीं देते हैं। फिर आप शीर्ष पर दिए गए निर्देश के अनुसार DDL कमांड पर वापस आ जाते हैं।

संबंधित:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेज के साथ स्प्रिंग डेटा निराशावादी लॉक टाइमआउट

  2. PostGIS त्रुटि:एक सर्वश्रेष्ठ उम्मीदवार समारोह का चयन नहीं कर सका

  3. डीबी कनेक्शन पर उपलब्ध पंक्ति के आधार पर गतिशील रूप से डीएजी बनाना

  4. उपनाम कॉलम में शामिल हों SQL

  5. PostgreSQL में वर्तमान समय कैसे प्राप्त करें