यह एक ग़लतफ़हमी प्रतीत होती है।
मेरे उत्तर से आपका उद्धरण थोड़ा भ्रामक है, क्योंकि यह केवल तभी लागू होता है जब आप वहां वर्णित अतिरिक्त आंशिक अनुक्रमणिका भी बनाते हैं:
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 पर इस संबंधित उत्तर में विवरण
।