sri*_*rip 2 postgresql database-design exclusion-constraint postgresql-9.3 range-types
我有一个表reservation
的列roomno(INTEGER)
,startdate(DATE)
,enddate(DATE)
与主键(roomno, startdate
)。
我如何在表上设置约束,以便不允许预订重叠?
我试图在SQLFIDDLE postgreSQL9.3 中实现这个
例如:
101 2016-01-01 2016-01-05
101 2016-01-03 2016-01-06 [This row should not be possible to insert]
Run Code Online (Sandbox Code Playgroud)
startdate
并且enddate
是数据类型date
。
使用排除约束并注意类型的边界是如何daterange
工作的。date
是离散类型,因此范围具有默认[)
范围。根据文档:
内置范围类型
int4range
、int8range
和daterange
都使用规范形式,包括下限和排除上限;也就是说,[)
。
因此,如果您要预订 2016-01-01 至 2016-01-05 的房间,包括第一天和最后一天,则必须明确指定界限:
daterange(start_date, end_date, '[]')
Run Code Online (Sandbox Code Playgroud)
或者您输入具有排他上限的日期;包括2016年1月5日,进入2016-01- 06。然后你可以使用更简单的表达式:
daterange(start_date, end_date)
Run Code Online (Sandbox Code Playgroud)
在排除约束中使用上述表达式使其成为功能索引,如@ypercube 所示:
通过这种方式,您可以像现在一样保留列。
或者您可以用一列替换startdate
和并在排除约束中使用普通列。就像在这个相关的答案中一样:enddate
daterange
无论哪种方式,假设roomno
是一个integer
列,您需要先安装附加模块btree_gist,每个数据库一次。
有关的:
归档时间: |
|
查看次数: |
1074 次 |
最近记录: |