قيد التفرد مع النطاق الزمني
-
29-09-2020 - |
سؤال
اعتبر أ prices
الجدول مع هذه الأعمدة:
id integer primary key
product_id integer -- foreign key
start_date date not null
end_date date not null
quantity integer
price numeric
أرغب في أن تقوم قاعدة البيانات بفرض القاعدة التي تنص على أنه لا يمكن أن يكون للمنتج سوى سعر واحد بكمية محددة في نطاق زمني (عبر where <date> BETWEEN start_date AND end_date
).
هل هذا النوع من القيود القائمة على النطاق قابل للتنفيذ؟
المحلول
نعم يمكنك استخدام EXCLUDE
القيد، وهو تعميم UNIQUE
قيود:
ALTER TABLE prices
ADD CONSTRAINT unique_price_per_product_quantity_daterange
EXCLUDE USING gist
( product_id WITH =,
quantity WITH =,
daterange(start_date, end_date, '[]') WITH && -- this is the crucial
);
ويمكن تفسير القيد بقوله:
لا تسمح بصفين لهما نفس الشيء
product_id
, ، نفسquantity
والتداخل (&&
) النطاقات الزمنية.
ال '[]'
مخصص للنطاق الزمني الشامل المطلوب (الإعداد الافتراضي هو [)
لأنواع النطاق).
انظر الوثائق على القيود على أنواع النطاق.ربما تحتاج أيضًا إلى إضافة الامتداد عن طريق التشغيل (مرة واحدة، لكل قاعدة بيانات تريد تثبيت هذا فيها):
CREATE EXTENSION btree_gist;
لا تنتمي إلى dba.stackexchange