आप जो पूछते हैं उसका समाधान
मान लें कि आप इसे लागू करना चाहते हैं:
"Id_Lot"
वास्तव में"Lot"."Code"
. में मौजूद है . -> एफके बाधा"Lot"."Empty"
मौके के लिएTRUE
है केवल चेक के समय।
आप कर सकते थे इसे NOT VALID
के साथ करें
CHECK
एक नकली IMMUTABLE
. का उपयोग करने में बाधा अन्य तालिका पर जाँच करने के लिए कार्य। विवरण:
लेकिन आपका डेटा मॉडल कई पहलुओं में अस्थिर है। मैं एक अधिक स्वच्छ दृष्टिकोण का सुझाव दूंगा।
बहिष्करण बाधा के साथ क्लीनर डिजाइन
स्टोर न करें कि क्या लॉट के साथ वर्तमान में लॉट बेमानी रूप से खाली है। यह बहुत ही त्रुटि प्रवण और समवर्ती मुद्दों के लिए अतिसंवेदनशील है। लागू करें कि प्रत्येक लॉट एक बार में केवल एक बहिष्करण प्रतिबंध
. उसके लिए काम करने के लिए, बाहर निकलने का समय ticket
. में बचाएं , इसके अतिरिक्त।
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
lot
. में कोई अनावश्यक वर्तमान स्थिति नहीं है टेबल।
बहिष्करण बाधा काम करने के लिए, आपको अतिरिक्त मॉड्यूल btree_gist<की आवश्यकता है /मजबूत> . विस्तृत निर्देश:
CREATE TABLE ticket (
ticket_id serial PRIMARY KEY
, during tsrange NOT NULL
, license_plate text NOT NULL REFERENCES "Vehicle"("L_Plate"),
, lot_id int NOT NULL REFERENCES lot
, CONSTRAINT lot_uni_ticket EXCLUDE USING gist (lot_id WITH =, during WITH &&)
, CONSTRAINT during_lower_bound_not_null CHECK (NOT lower_inf(during))
, CONSTRAINT during_bounds CHECK (lower_inc(during) AND NOT upper_inc(during))
);
-
टाइमस्टैम्प श्रेणी डेटा प्रकार का उपयोग करना
tsrange
पार्किंग अवधि के लिएduring
जब कार प्रवेश करती है, तो ऊपरी बाउंड NULL के साथ दर्ज करें। कार के बाहर निकलने पर अपर बाउंड के साथ अपडेट करें। अन्य बातों के अलावा, यह कारों को कई दिनों तक पार्क करना भी संभव बनाता है। -
कुछ अतिरिक्त
CHECK
during
. पर बुनियादी नियमों को लागू करने में बाधाएं :- समावेशी निचली सीमा, संगत रहने के लिए अनन्य ऊपरी सीमा।
- निचला बाउंड (प्रवेश द्वार) कभी गायब नहीं हो सकता।
संबंधित: