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

विशिष्टता को लागू करने के लिए एक बहु-स्तंभ अनुक्रमणिका बनाएं

यह एक ग़लतफ़हमी प्रतीत होती है।

मेरे उत्तर से आपका उद्धरण थोड़ा भ्रामक है, क्योंकि यह केवल तभी लागू होता है जब आप वहां वर्णित अतिरिक्त आंशिक अनुक्रमणिका भी बनाते हैं:
PostgreSQL पर कंडीशनल यूनिक इंडेक्स कैसे जोड़ें

यदि आप इस दूसरी अनुक्रमणिका को नहीं जोड़ते हैं (जैसे आपने नहीं किया), आपके पास पहले से ही आपका समाधान है , ऐसा लगेगा। केवल बहु-स्तंभ अद्वितीय अनुक्रमणिका के साथ, आप (1, NULL) enter दर्ज कर सकते हैं कई बार, लेकिन (1,2) या (1,3) केवल एक बार।

खाली तार

अगर, गलती से, आप खाली स्ट्रिंग्स ('' . पर विचार कर रहे थे ) (एक चरित्र प्रकार के लिए ) NULL . के बजाय मान:जिन्हें किसी अन्य मान की तरह संभाला जाता है। आप कर सकते थे बहु-स्तंभ, आंशिक रूप से कार्यात्मक अद्वितीय अनुक्रमणिका . का उपयोग करके इस स्थिति से निपटें (एक व्यंजक पर अनुक्रमणिका ):

CREATE UNIQUE INDEX predictions _dim_tat_uni_idx
ON predictions (tat, NULLIF(dim, ''));

इस तरह आप (1, 'a') . दर्ज कर सकते हैं , (1, 'b') केवल एक बार।
लेकिन (1, NULL) और (1, '') कई बार।

दुष्प्रभाव

सूचकांक अभी भी पहले कॉलम (tat . पर सादे प्रश्नों का पूरी तरह से समर्थन करेगा ).
लेकिन दोनों स्तंभों पर प्रश्नों को पूरी क्षमता का उपयोग करने के लिए अभिव्यक्ति से मेल खाना होगा। यह तेज़ होगा, भले ही इसका कोई मतलब न हो:

SELECT * FROM predictions
WHERE  tat = 1
AND    NULLIF(dim, '') = 'foo';

.. इससे:

SELECT * FROM predictions
WHERE  tat = 1
AND    dim = 'foo';

.. क्योंकि पहली क्वेरी दोनों इंडेक्स कॉलम का उपयोग कर सकती है। परिणाम वही होगा ('' . को खोजने के अलावा या NULL ) dba.SE पर इस संबंधित उत्तर में विवरण




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Plpgsql में सरणी आयाम पर लूप करें

  2. pgAdmin3 कनेक्शन की समस्या

  3. अद्वितीय इंडेक्स कैसे बनाएं जहां कॉलम ऑर्डर को ध्यान में नहीं रखा जाता है (सेट?)

  4. टाइमस्टैम्प की तारीख को अनदेखा करते हुए समय सीमा पर क्वेरी

  5. पोस्टग्रेज:एक कनेक्शन में समवर्ती क्वेरी