【问题标题】:Oracle SQL: How to use CHECK Constraint to not allow overlap reservation datesOracle SQL:如何使用 CHECK 约束不允许重叠预订日期
【发布时间】:2019-05-19 10:13:51
【问题描述】:

我遇到了一个问题

假设您是一家酒店的经理,该酒店的数据库中有一个数据库

CREATE TABLE Hotel
       (roomnr SMALLINT NOT NULL,
        arrival DATE NOT NULL,
        departure DATE NOT NULL,
        guest CHAR (30),
        PRIMARY KEY (roomnr, arrival)
        CHECK (departure >= arrival));

具有以下定义的表:

所以你不能在你到达之前离开这家酒店。

更改此定义,以便您不能在表格中输入到达日期与现有出发日期冲突的预订。 算作碰撞

  • 两个一侧重叠,例如3.1.-6.1。已经预订和 1.1.- 5.1.或 4.1.-10.1。比预定

  • 以及双边重叠,例如2.1.-6.1。已经预订和 1.1.- 10.1.或 3.1.-5.1。而不是预订。

【问题讨论】:

  • 如果您没有得到准确的答案,则可能无法通过检查约束来执行此操作。在这种情况下,请考虑使用触发器。

标签: sql oracle constraints overlap overlap2d


【解决方案1】:

Oracle 不支持内置范围数据类型(据我所知)。因此,它没有内置的重叠功能。

为了实施这样的检查,您有两种选择:

  • 创建一个用于检查重叠的用户定义函数。在检查约束中使用此函数。
  • 编写一个检查重叠的触发器。

(第二个在 Oracle 中可能会因为变异表错误而变得棘手。)我认为您需要编写一个函数以在检查约束中使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多