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

एकाधिक स्तंभों में PostgreSQL अद्वितीय मान

अफसोस की बात है कि इसे सरल अद्वितीय बाधाओं/अनुक्रमणिकाओं के साथ आसानी से हल नहीं किया जा सकता है (यदि इसे उनके साथ हल किया जा सकता है)।

आपको एक बहिष्करण की आवश्यकता है। ए> बाधा :टकराव . जैसी किसी चीज़ के आधार पर कुछ पंक्तियों को बाहर करने की क्षमता . अद्वितीय बाधाएं केवल विशिष्ट बहिष्करण बाधाएं हैं (वे समानता पर आधारित हैं टकराव )।

तो, सिद्धांत रूप में, आपको बस प्रत्येक 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

... लेकिन मुझे डर है, आपकी मूल समस्या को थोड़ा डेटाबेस रीफैक्टरिंग के साथ बहुत आसान हल किया जा सकता है; जो हमें इस प्रश्न पर लाता है:क्या समस्या है, क्या आप इससे हल करना चाहते हैं?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आवश्यक PostgreSQL निगरानी - भाग 2

  2. यह ActiveRecord कथन सर्वर में विफल क्यों हो रहा है लेकिन कंसोल नहीं?

  3. sqlalchemy का उपयोग करके postgresql से कनेक्ट करते समय त्रुटि

  4. पोस्टग्रेज में डुप्लिकेट हटाएं

  5. त्रुटि:INTO में या उसके निकट INTO को एक से अधिक बार निर्दिष्ट किया गया