spi*_*ike 15 postgresql database-design exclusion-constraint postgresql-9.4
考虑一个prices
包含这些列的表:
id integer primary key
product_id integer -- foreign key
start_date date not null
end_date date not null
quantity integer
price numeric
Run Code Online (Sandbox Code Playgroud)
我希望数据库强制执行这样的规则,即产品在日期范围内(通过where <date> BETWEEN start_date AND end_date
)的特定数量只能有一个价格。
这种基于范围的约束可行吗?
ype*_*eᵀᴹ 29
是的,您可以使用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
);
Run Code Online (Sandbox Code Playgroud)
约束可以解释为:
不允许有相同
product_id
、相同quantity
和重叠 (&&
) 日期范围的两行。
该'[]'
是为希望全包的日期范围(默认是[)
用于范围类型)。
请参阅有关范围类型约束的文档。您可能还需要通过运行来添加扩展(一次,对于要安装它的每个数据库):
CREATE EXTENSION btree_gist;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8074 次 |
最近记录: |