2009-07-28 6 views
97

मेरे पास निम्न तालिका है:क्या मैं पहले से बनाए जाने के बाद, PostgreSQL तालिका में एक विशिष्ट बाधा जोड़ सकता हूं?

 tickername | tickerbbname | tickertype 
------------+---------------+------------ 
USDZAR  | USDZAR Curncy | C 
EURCZK  | EURCZK Curncy | C 
EURPLN  | EURPLN Curncy | C 
USDBRL  | USDBRL Curncy | C 
USDTRY  | USDTRY Curncy | C 
EURHUF  | EURHUF Curncy | C 
USDRUB  | USDRUB Curncy | C 

मैं नहीं चाहता कि किसी भी tickername/tickerbbname जोड़ी के लिए कभी भी एक से अधिक स्तंभ हो। मैंने पहले ही टेबल बनाया है और इसमें बहुत सारे डेटा हैं (जो मैंने पहले से ही सुनिश्चित किया है अद्वितीय मानदंडों को पूरा करता है)। चूंकि यह बड़ा हो जाता है, हालांकि, त्रुटि के लिए कमरा क्रिप्प्स में है। Xzx24

क्या इस बिंदु पर UNIQUE बाधा जोड़ने का कोई तरीका है?

+0

संभव डुप्लिकेट [मैं एक PostgreSQL तालिका कैसे बदल सकती हैं और एक स्तंभ अद्वितीय बनाने? है] (http://stackoverflow.com/questions/469471/how-do-i-alter-a-postgresql-table -और-मेक-ए-कॉलम-अनन्य) –

उत्तर

205

psql की इनलाइन मदद:

\h ALTER TABLE 

इसके अलावा postgres docs में दस्तावेज (एक उत्कृष्ट संसाधन, के साथ साथ पढ़ने में आसान, भी)।

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns); 
+1

धन्यवाद @hamamu। हाँ ने दस्तावेज़ों को आजमाया लेकिन आपका उपरोक्त अधिक संक्षिप्त है। –

+54

यदि आप पोस्टग्रेएसक्यूएल को इंडेक्स नाम उत्पन्न करना चाहते हैं, तो 'वैकल्पिक तालिका टैबलेट नाम अद्वितीय (कॉलम) का उपयोग करें; '। (ध्यान दें कि 'CONSTRAINT' कीवर्ड छोड़ा जाना चाहिए।) – jpmc26

+2

मुझे इस प्रश्न का उत्तर चाहिए और दस्तावेज़ों के लिए googling शुरू किया। Postgres प्रलेखन के बजाय, मैं इस विषय में StackOverflow पर भाग गया। इसलिए हालांकि आधिकारिक दस्तावेज़ों का संदर्भ देना अच्छा विचार है, लेकिन भविष्य की यात्राओं के लिए उत्तर देने के लिए भी बहुत अच्छा है। उसके लिये आपका धन्यवाद। – Leonard

2

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

+3

'

समूह से 1 गिनती (*)> 1; का चयन करें,' डुप्लिकेट मानों पर एक रिपोर्ट देगा। – Jasen

25

हाँ, आप कर सकते हैं। लेकिन अगर आपके टेबल पर अनन्य प्रविष्टियां हैं, तो यह असफल हो जाएगी। यहां आपकी तालिका पर अद्वितीय बाधा जोड़ने का तरीका बताया गया है। यदि आप PostgreSQL 9x का उपयोग कर रहे हैं तो आप नीचे निर्देश का पालन कर सकते हैं।

CREATE UNIQUE INDEX constraint_name ON table_name (columns); 
+3

धन्यवाद ज़ेक - अच्छा 2y बाद का जवाब लेकिन अभी भी सराहना करता है कि लोग अभी भी समय लेते हैं! टॉम –

+1

यह सही नहीं है। नवीनतम पोस्टग्रेज़ में यह "कुंजी (uuid) = (3a533772-07ac-4e76-b577-27a3878e2222) संदेश को भी ले जाता है। क्वेरी विफल हुई है" यदि आपके पास कोई ऐसा मूल्य है जो अद्वितीय नहीं है ... – Strinder

+1

@ स्ट्रिंडर, यह अच्छी बात नहीं है? पहले डुप्लिकेट डेटा को ठीक करें। – Jasen

0

आप एक तालिका कि पहले से ही के आधार पर एक मौजूदा बाधाओं था तो कहते हैं कि करने देता है:

ALTER TABLE your_table DROP CONSTRAINT constraint_name; 
: नाम और उपनाम और आप एक और अद्वितीय बाधा जोड़ना चाहते थे, तो आप द्वारा पूरे विवश छोड़ना पड़ा

सुनिश्चित करें कि आप जिस नई बाधा को जोड़ना चाहते हैं वह अनन्य/शून्य नहीं है (यदि इसका माइक्रोसॉफ्ट एसक्यूएल है, इसमें केवल एक शून्य मान हो सकता है) उस तालिका के सभी डेटा पर, और फिर आप इसे फिर से बना सकते हैं।

ALTER TABLE table_name 
ADD CONSTRAINT constraint_name UNIQUE (column1, column2, ... column_n); 
की