PostgreSQL में बाधा नाम अपडेट


89

क्या Postgres में बाधा नाम बदलना संभव है? मेरे पास एक PK जोड़ा गया है:

ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);

और मैं इसके लिए अलग नाम रखना चाहता हूं, बाकी सिस्टम के अनुरूप होना चाहिए। क्या मैं मौजूदा पीके बाधा को हटा दूं और एक नया बनाऊं? या इसे प्रबंधित करने का कोई 'नरम' तरीका है?

धन्यवाद!

जवाबों:


82

प्राथमिक कुंजी के लिए, आपको बस सक्षम होना चाहिए:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

हालांकि यह अन्य प्रकार की बाधाओं के लिए काम नहीं करेगा। सबसे अच्छा विकल्प पुराने को छोड़ देना और नया बनाना है। लेन-देन के अंदर करना सुनिश्चित करें, इसलिए सिस्टम पुनर्निर्माण के दौरान इसके बिना नहीं रहता है। (और यदि आप इसे लेन-देन में नहीं कर सकते हैं , तो पुराने को छोड़ने से पहले नया निर्माण करना सुनिश्चित करें )


153

PostgreSQL 9.2 या नए में मौजूदा बाधा का नाम बदलने के लिए , आप ALTER TABLE का उपयोग कर सकते हैं :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

1
@ArturoHerrero क्या हम एक साथ कई बाधाओं पर नाम बदल सकते हैं, यदि हाँ, तो कैसे?
एर्लान

1
@ यदि आप क्वेरी के माध्यम से सभी बाधाओं की सूची प्राप्त कर सकते हैं pg_catalog, तो उस पर पुनरावृति LOOPकरें और नाम बदलने के लिए एक गतिशील क्वेरी का उपयोग करें।
एवगेनी नोज़ड्रेव

1

हमने पाया कि प्राथमिक कुंजियाँ अक्सर मुख्य तालिका के नाम से पिछड़ जाती हैं। इस स्क्रिप्ट ने हमें मुद्दों के साथ लोगों को पहचानने और उन्हें ठीक करने में मदद की।

select 
    table_name, 
    constraint_name , 
    'ALTER TABLE ' || table_name || ' RENAME CONSTRAINT ' || constraint_name || ' TO ' || left(table_name, 58) || '_pkey;'
from information_schema.table_constraints tc
where constraint_type  = 'PRIMARY KEY' 
and constraint_name <> left(table_name, 58) || '_pkey';

यह उन सभी तालिकाओं को खोजता है जहां प्राथमिक कुंजी नाम "डिफ़ॉल्ट" पैटर्न नहीं है ( <tablename>_pkey) और प्रत्येक के लिए एक नाम स्क्रिप्ट बनाता है।

ऊपर दिए गए कोड में 58 वर्ण की सीमा को बाधा नामों (63bytes) के अधिकतम आकार के लिए जिम्मेदार है।

स्पष्ट रूप से समझें कि इसे चलाने से पहले क्या लौटा है। आशा है कि दूसरों के लिए उपयोगी है।

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