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

सीरियल प्राथमिक कुंजी कॉलम का उपयोग करके सुरक्षित रूप से तालिकाओं का नाम बदलें

serial वास्तविक डेटा प्रकार नहीं है। मैनुअल कहता है:

<ब्लॉककोट>

डेटा प्रकार smallserial , serial और bigserial सही प्रकार नहीं हैं, लेकिन विशिष्ट पहचानकर्ता कॉलम बनाने के लिए केवल एक उल्लेखनीय सुविधा है

यह सब करते हुए छद्म डेटा प्रकार का समाधान किया जाता है:

  • tablename_colname_seq . नाम का एक क्रम बनाएं

  • integer . प्रकार के साथ कॉलम बनाएं (या int2 / int8 क्रमशः smallserial . के लिए / bigserial )

  • कॉलम बनाएं NOT NULL DEFAULT nextval('tablename_colname_seq')

  • कॉलम को अनुक्रम का स्वामी बनाएं, ताकि वह इसके साथ अपने आप छूट जाए

सिस्टम नहीं करता है जानें कि आपने यह सब हाथ से किया है या छद्म डेटा प्रकार serial . के माध्यम से किया है . pgAdmin सूचीबद्ध सुविधाओं पर जाँच करता है और यदि सभी मिलते हैं, तो रिवर्स इंजीनियर DDL स्क्रिप्ट को मिलान serial के साथ सरल बनाया जाता है प्रकार। यदि सुविधाओं में से एक को पूरा नहीं किया जाता है, तो यह सरलीकरण नहीं होता है। ऐसा कुछ है जो pgAdmin करता है। अंतर्निहित कैटलॉग टेबल के लिए यह वही है। कोई serial नहीं है इस तरह टाइप करें।

स्वामित्व वाले अनुक्रमों का स्वचालित रूप से नाम बदलने का कोई तरीका नहीं है। आप दौड़ सकते हैं:

ALTER SEQUENCE ... RENAME TO ...

जैसा आपने किया। सिस्टम स्वयं नाम . की परवाह नहीं करता है . कॉलम DEFAULT एक OID स्टोर करता है ('foo_pkey_seq'::regclass ), आप अनुक्रम का नाम बदले बिना बदल सकते हैं - OID वही रहता है। वही डेटाबेस के अंदर विदेशी कुंजी और समान संदर्भों के लिए जाता है।

प्राथमिक कुंजी के लिए निहित सूचकांक पीके बाधा के नाम से जुड़ा है, जो नहीं होगा यदि आप तालिका का नाम बदलते हैं तो बदलें। Postgres 9.2 या बाद के संस्करण में आप

. का उपयोग कर सकते हैं
ALTER TABLE ... RENAME CONSTRAINT ..

उसे भी सुधारने के लिए।

तालिका नाम के संदर्भ में नामित अनुक्रमणिकाएं भी हो सकती हैं। इसी तरह की प्रक्रिया:

ALTER INDEX .. RENAME TO  ..

आपके पास तालिका के नाम के सभी प्रकार के अनौपचारिक संदर्भ हो सकते हैं। सिस्टम उन वस्तुओं का जबरन नाम नहीं बदल सकता है जिसे आपकी पसंद का कुछ भी नाम दिया जा सकता है। और इससे कोई फ़र्क नहीं पड़ता।

बेशक आप उन नामों का संदर्भ देने वाले SQL कोड को अमान्य नहीं करना चाहते हैं। जाहिर है, आप नाम बदलना नहीं चाहते हैं जबकि एप्लिकेशन लॉजिक उनका संदर्भ देता है। आम तौर पर यह अनुक्रमणिका, अनुक्रम या बाधाओं के नामों के लिए कोई समस्या नहीं होगी, क्योंकि उन्हें आमतौर पर नाम से संदर्भित नहीं किया जाता है।

पोस्टग्रेज वस्तुओं का नाम बदलने से पहले उन पर ताला भी लगा लेता है। तो अगर समवर्ती लेन-देन . हैं खुला है जिसमें प्रश्नगत वस्तुओं पर किसी भी प्रकार का ताला है, आपका RENAME संचालन तब तक रुका रहता है जब तक कि वे लेन-देन कमिट या रोल बैक नहीं हो जाते।

सिस्टम कैटलॉग और OIDs

डेटाबेस स्कीमा को सिस्टम कैटलॉग की तालिका में सिस्टम स्कीमा pg_catalog . में संग्रहीत किया जाता है . मैनुअल में सभी विवरण यहाँ। यदि आप ठीक से नहीं जानते कि आप क्या कर रहे हैं, तो आपको उन तालिकाओं के साथ बिल्कुल भी खिलवाड़ नहीं करना चाहिए . एक गलत कदम और आप अपना डेटाबेस तोड़ सकते हैं। पोस्टग्रेज़ द्वारा प्रदान किए गए डीडीएल कमांड का उपयोग करें।

कुछ सबसे महत्वपूर्ण तालिकाओं के लिए Postgres ऑब्जेक्ट पहचानकर्ता प्रकार प्रदान करता है और OID के लिए नाम प्राप्त करने के लिए टाइप करता है और इसके विपरीत जल्दी से। पसंद:

SELECT 'foo_pkey_seq'::regclass

यदि स्कीमा नाम search_path . में है और तालिका का नाम अद्वितीय है, जो आपको वही देता है:

SELECT oid FROM pg_class WHERE relname = 'foo_pkey_seq';

अधिकांश कैटलॉग तालिकाओं की प्राथमिक कुंजी oid है और आंतरिक रूप से, अधिकांश संदर्भ OID का उपयोग करते हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Slony-I में स्विचओवर/स्विचबैक PostgreSQL के प्रमुख संस्करणों को अपग्रेड करते समय 8.4.x/9.3.x

  2. एकल क्वेरी में एकाधिक सीटीई

  3. Django cache.set () डुप्लिकेट कुंजी त्रुटि उत्पन्न कर रहा है

  4. postgresql - टेक्स्ट फ़ील्ड के भीतर एक स्ट्रिंग के सभी उदाहरणों को बदलें

  5. पायथन ई को स्ट्रिंग में जोड़ता है