गैर-अतिव्यापी समय सीमाओं के साथ प्रविष्टियां कैसे सुनिश्चित करें?

वोट
1

मुझे यह सुनिश्चित करने की आवश्यकता है कि मेरे डेटाबेस में केवल प्रविष्टियाँ हैं जहाँ इसके दो या अधिक स्तंभ अद्वितीय हैं। इसे आसानी से हासिल किया जा सकता है UNIQUE उन स्तंभों पर बाधा।

मेरे मामले में, मुझे केवल ओवरलैपिंग समय सीमाओं के लिए दोहराव को रोकने की आवश्यकता है। मेज है valid_from तथा valid_to कॉलम। कुछ मामलों में किसी को पहले सेटिंग से सक्रिय प्रविष्टि को समाप्त करने की आवश्यकता हो सकती है valid_to = now , और उसके बाद समायोजित नई प्रविष्टि सम्मिलित करना valid_from = now तथा valid_to = infinity

मैं किसी भी समस्या का उपयोग किए बिना पूर्व प्रविष्टि को समाप्त करने में सक्षम प्रतीत होता हूं UPDATE , लेकिन नई प्रविष्टि डालने से मुझे परेशानी हो रही है क्योंकि मेरे आधार कॉलम वर्तमान में हैं UNIQUE , और इसलिए फिर से जोड़ा नहीं जा सकता।

मैंने जोड़ने का सोचा valid_from तथा valid_to जैसे कि हिस्से के रूप में UNIQUE बाधा, लेकिन यह बस बाधा को और अधिक ढीली कर देगा, और डुप्लिकेट और अतिव्यापी समय सीमाओं को मौजूद होने की अनुमति देगा।

मैं यह सुनिश्चित करने के लिए एक बाधा कैसे बना सकता हूं कि डुप्लिकेट ओवरलैपिंग के साथ मौजूद नहीं हैं valid_from तथा valid_totsrange ?

मुझे लग रहा है EXCLUDE USING GIST , लेकिन यह कई कॉलम का समर्थन नहीं करता है? यह मेरे लिए काम नहीं करता है:

ALTER TABLE registration 
DROP Constraint IF EXISTS registration_{string.Join('_', listOfAttributes)}_key, 
ADD Constraint registration_{string.Join('_', listOfAttributes)}_key EXCLUDE USING GIST({string.Join(',', listOfAttributes)} WITH =, valid WITH &&);
10/05/2020 को 19:31
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


1 जवाब

वोट
0

आप सही रास्ते पर थे। लेकिन बहिष्करण बाधाओं के लिए वाक्यविन्यास थोड़ा अलग है:

CREATE TABLE registration  (
  tbl_id  integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
, col_a   integer NOT NULL
, col_b   integer NOT NULL
, valid_from timestamptz
, valid_to   timestamptz
, CONSTRAINT no_overlap
    EXCLUDE USING gist (col_a with =, col_b with =, tstzrange(valid_from, valid_to) WITH &&)
);

आपको अतिरिक्त मॉड्यूल स्थापित करने की आवश्यकता हो सकती है btree_gist सबसे पहले, आपकी अघोषित तालिका परिभाषा के आधार पर।

प्रत्येक कॉलम को अपने संबंधित ऑपरेटर के साथ सूचीबद्ध होना चाहिए।

और आपको एक रेंज प्रकार की आवश्यकता है। यह मानते हुए timestamp with time zone के लिये valid_from तथा valid_to , भाव tstzrange(valid_from, valid_to) कर लेती।

सम्बंधित:


हो सकता है , एक बेहतर डिजाइन आपके बीच एक-से-कई रिश्ते होंगे registration तालिका और नई में 1-एन प्रविष्टियाँ registration_range तालिका। और वर्तमान में मान्य प्रविष्टि (किसी भी समय बिंदु के लिए) निर्धारित करने के लिए कुछ तर्क। अधिक अज्ञात जानकारी पर निर्भर करता है।

13/05/2020 को 18:31
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more