अफसोस की बात है कि इसे सरल अद्वितीय बाधाओं/अनुक्रमणिकाओं के साथ आसानी से हल नहीं किया जा सकता है (यदि इसे उनके साथ हल किया जा सकता है)।
आपको एक बहिष्करण की आवश्यकता है। ए> बाधा :टकराव . जैसी किसी चीज़ के आधार पर कुछ पंक्तियों को बाहर करने की क्षमता . अद्वितीय बाधाएं केवल विशिष्ट बहिष्करण बाधाएं हैं (वे समानता पर आधारित हैं टकराव )।
तो, सिद्धांत रूप में, आपको बस प्रत्येक row1
. को बाहर करने की आवश्यकता है , जहां पहले से ही एक row2
है , जिसके लिए यह व्यंजक सत्य है:ARRAY[row1.cola, row1.colb] && ARRAY[row2.cola, row2.colb]
यह अनुक्रमणिका सकता काम करो (वर्तमान में केवल gist
अनुक्रमणिका बहिष्करण बाधाओं का समर्थन करती है):
ALTER TABLE table_name
ADD CONSTRAINT table_name_exclusion
EXCLUDE USING gist ((ARRAY[cola, colb]) WITH &&);
लेकिन दुर्भाग्य से, सरणियों के लिए कोई डिफ़ॉल्ट ऑपरेटर वर्ग नहीं है (जो gist
. का उपयोग करता है) ) एक intarray
है मॉड्यूल
, जो केवल integer
. के लिए एक प्रदान करता है arrays, लेकिन text
. के लिए कुछ नहीं सरणियाँ।
अगर आप वाकई इस पर काम करना चाहते हैं, तो आप हमेशा range
प्रकार
(f.ex. मैंने आसन्न -|-
. का उपयोग किया है ऑपरेटर, जो सभी मामलों को संभालता है, जिसे unique
. के साथ नियंत्रित नहीं किया जा सकता है ) ...
-- there is no built-in type for text ranges neither,
-- but it can can be created fairly easily:
CREATE TYPE textrange AS RANGE (
SUBTYPE = text
);
ALTER TABLE table_name
ADD CONSTRAINT table_name_exclusion
EXCLUDE USING gist ((textrange(least(cola, colb), greatest(cola, colb))) WITH -|-);
-- the exclusion constraint above does not handle all situations:
ALTER TABLE table_name
ADD CONSTRAINT table_name_check
CHECK (cola is distinct from colb); -- without this, empty ranges could be created,
-- which are not adjacent to any other range
CREATE UNIQUE INDEX table_name_unique
ON table_name ((ARRAY[least(cola, colb), greatest(cola, colb)]));
-- without this, duplicated rows could be created,
-- because ranges are not adjacent to themselves
... लेकिन मुझे डर है, आपकी मूल समस्या को थोड़ा डेटाबेस रीफैक्टरिंग के साथ बहुत आसान हल किया जा सकता है; जो हमें इस प्रश्न पर लाता है:क्या समस्या है, क्या आप इससे हल करना चाहते हैं?