Postgresql
對日期範圍設置唯一性約束
我有一個
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]
startdate
並且enddate
是數據類型date
。
使用排除約束並註意類型的邊界是如何
daterange
工作的。date
是離散類型,因此範圍具有預設[)
範圍。根據文件:內置的範圍類型
int4range
,int8range
和daterange
都使用包含下限但不包括上限的規範形式;也就是說,[)
.因此,如果您想預訂 2016 年 1 月 1 日至 2016 年 1 月 5 日的房間,包括第一天和最後一天,您必須明確指定範圍:
daterange(start_date, end_date, '[]')
或者您輸入具有唯一上限的日期;要包括 2016-01-05,請輸入2016-01-06。然後你可以使用更簡單的表達式:
daterange(start_date, end_date)
在排除約束中使用上述表達式使其成為功能索引,如@ypercube 所示:
這樣您就可以像現在一樣保留列。
或者,您可以將
startdate
and替換enddate
為daterange
列並在排除約束中使用普通列。就像在這個相關的答案中一樣:無論哪種方式,假設
roomno
是一個integer
列,您需要先安裝附加模組btree_gist,每個數據庫一次。有關的: