Postgresql

對日期範圍設置唯一性約束

  • June 1, 2016

我有一個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,int8rangedaterange都使用包含下限但不包括上限的規範形式;也就是說,[).

因此,如果您想預訂 2016 年 1 月 1 日至 2016 年 1 月 5 日的房間,包括第一天和最後一天,您必須明確指定範圍:

daterange(start_date, end_date, '[]')

或者您輸入具有唯一上限的日期;要包括 2016-01-05,請輸入2016-01-06。然後你可以使用更簡單的表達式:

daterange(start_date, end_date)

在排除約束中使用上述表達式使其成為功能索引,如@ypercube 所示:

這樣您就可以像現在一樣保留列。

或者,您可以將startdateand替換enddatedaterange列並在排除約束中使用普通列。就像在這個相關的答案中一樣:

無論哪種方式,假設roomno是一個integer列,您需要先安裝附加模組btree_gist,每個數據庫一次。

有關的:

引用自:https://dba.stackexchange.com/questions/140024