سؤال

اعتبر أ 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى dba.stackexchange
scroll top