क्या मैं पहले से ही बनाये जाने के बाद एक पोस्टग्रैसक्यूएल तालिका में एक UNIQUE बाधा जोड़ सकता हूँ?


185

मेरे पास निम्न तालिका है:

 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जोड़े के लिए एक से अधिक कॉलम हों । मैंने पहले ही तालिका बना ली है और इसमें बहुत सारे डेटा हैं (जो मैंने पहले ही सुनिश्चित कर लिया है कि यह अद्वितीय मानदंडों को पूरा करता है)। जैसा कि यह बड़ा हो जाता है, हालांकि, त्रुटि के लिए कमरे में रेंगना है।

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


जवाबों:


362

psqlइनलाइन सहायता:

\h ALTER TABLE

डाक डॉक्स (एक उत्कृष्ट संसाधन, साथ ही पढ़ने में आसान) में भी प्रलेखित ।

ALTER TABLE tablename ADD CONSTRAINT constraintname UNIQUE (columns);

6
धन्यवाद @ हहमु। हां डॉक्स की कोशिश की, लेकिन अपने ऊपर बहुत अधिक संक्षिप्त है।
थॉमस ब्राउन

117
यदि आप PostgreSQL को इंडेक्स नाम उत्पन्न करने देना चाहते हैं, तो उपयोग करें ALTER TABLE tablename ADD UNIQUE (columns);। (ध्यान दें कि CONSTRAINTकीवर्ड को छोड़ा जाना चाहिए।)
jpmc26

5
मुझे इस बहुत ही सवाल का जवाब चाहिए था और डॉक्स के लिए गुगली करना शुरू कर दिया। पोस्टग्रेज डॉक्यूमेंटेशन के बजाय, मैं स्टैकऑवरफ्लो में इस विषय पर भाग गया। इसलिए यद्यपि यह आधिकारिक डॉक्स को संदर्भित करने के लिए एक अच्छा विचार है, भविष्य की यात्राओं के लिए उत्तर देना भी बहुत अच्छा है। उसके लिये आपका धन्यवाद।
लियोनार्ड

@ jpmc26 «यदि आप PostgreSQL को इंडेक्स नाम उत्पन्न करना चाहते हैं» तो आपका मतलब है कि बाधा नाम?
tuxayo

4
@tuxayo, Postgres (पांडित्य नहीं होना) में एक सूचकांक के माध्यम से एक अद्वितीय-बाधा को लागू किया जाता है।
क्रिस डब्ल्यू।

36

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

CREATE UNIQUE INDEX constraint_name ON table_name (columns);

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

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

3
@Strinder, यह कैसे एक अच्छी बात है? पहले डुप्लिकेट डेटा को ठीक करें।
१२:५५ पर जैसन

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

स्पष्टता के लिए उत्तर का संपादन किया
जेवियर हो

6

यदि आपके पास एक मेज है जो पहले से ही मौजूदा बाधाओं के आधार पर बताती है: नाम और अंतिम नाम और आप एक और अनूठी बाधा जोड़ना चाहते थे, तो आपको संपूर्ण बाधा को छोड़ना होगा:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

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

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

5

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


7
select <column> from <table> group by 1 having count(*) > 1;डुप्लिकेट किए गए मानों पर एक रिपोर्ट देगा।
जसेंन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.