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 का उपयोग करते हैं।