2017-06-12 153 views
0

我有一个表格“节假日”,代表人们的假期。它包含一个FK表,一个起始日期列和一个日期列。我想添加一个约束,以便没有人可以与他们自己重叠假期。因此,如果比利在1月15日至20日举行滑雪假期,他不能在1月18日再度假?但他在1月21日这样做可以吗?数据库中的日期范围唯一约束条件

这是可能的在数据库级通过约束?

DB2或Oracle可以满足吗?

谢谢

+0

对于不同的DBMS,答案会不同。请将您的问题限制在DB2或Oracle。 –

回答

1

您可以创建一个存储过程,它至少包含当前行的datestart和dateend,并使用它们的参数。如果表中存在一个不良范围,否则此过程返回1.然后,当此结果过程= 0时,创建约束检查。

1

不直接。约束条件(至少在Oracle中,我不能说其他数据库)一次只能处理一行,它们不会查看其他行 - 除了跨行查看的UNIQUE约束之外。

所以 - 两种解决方案。一个是,而不是存储范围,每个节日DAY存储一行。 (顺便说一句,我相信你所说的“假期”至少在美国是所谓的“假期”,“假日”是为公共假期保留的,对所有人来说都是如此,如新年或圣诞节等)。这种安排,在(person_id,vacation_day)上添加一个UNIQUE约束。然后重新处理您的输入和报告应用程序,将范围转换为单独的日期,并分别从单独的日期转换为范围。

如果你必须存储范围,另一个解决方案是创建一个带有提交时刷新的物化视图(如果条件允许,最好快速刷新),它显示person_id和vacation_day,每天一行 - 并放置一个UNIQUE约束在物化视图上。

+0

在Postgres中你可以创建这样一个约束。 –

+0

@a_horse_with_no_name - 不是我的一杯牛奶! :-) – mathguy

2

在DB2中可以使用时态表和时间旅行查询 - 检查出doumentation

使用业务的时间与业务周期中的时表将允许定义哪些强制执行期间不重复的索引

CREATE UNIQUE INDEX I_vacation ON vacation (person, BUSINESS_TIME WITHOUT OVERLAPS)