अद्वितीय बाधा के लिए शर्त जोड़ना

Dec 05 2020

वर्तमान में मेरे पास एक मेज पर निम्नलिखित बाधाएं हैं:

ALTER TABLE myTable
            ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id);

मैं बाधा के लिए एक शर्त जोड़ना चाहता हूं: मैं चाहता हूं कि बाधा उसी तरह काम करे, लेकिन केवल एक पंक्ति जहां is_archived है FALSE:

ALTER TABLE myTable
         ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id, !is_archived);

हालाँकि, जब मैं ऐसा करता हूं तो मुझे एक सिंटैक्स त्रुटि मिलती है।

यदि is_archived = trueएक ही संयोजन के साथ कई पंक्तियाँ content_idऔर brand_idअनुमति है। मूल रूप से कई पंक्तियाँ जो समान हैं, उन्हें संग्रहीत किया जा सकता है, लेकिन केवल एक को ही अनारक्षित किया जा सकता है।

जवाब

4 Colin'tHart Dec 05 2020 at 00:59

जबकि Postgres आंशिक रूप से अद्वितीय बाधा की अनुमति नहीं देता है, यह एक आंशिक अद्वितीय सूचकांक का समर्थन करता है:

create unique index unique_row on myTable(content_id, brand_id) where not is_archived;

Postgres प्रलेखन में आंशिक सूचकांक देखें ।

यह प्रभावी रूप से एक अद्वितीय बाधा के रूप में बहुत अधिक है, क्योंकि इस तरह की बाधाओं को वैसे भी अद्वितीय अनुक्रमित के साथ लागू किया जाता है।