Oracle SQL:如何使用 CHECK 约束来不允许重叠预订日期
Oracle SQL: How to use CHECK Constraint to not allow overlap reservation dates
我悬着一个问题
假设您是一家酒店的经理,酒店的数据库中有一个数据库
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));
Table 定义如下:
所以您不能在到达之前离开这家酒店。
更改此定义,以便您无法在到达日期与现有出发日期冲突的 table 中输入预订。
算作一次碰撞
两者单边重叠,例如3.1.-6.1.已经预订和 1.1.- 5.1。或 4.1.-10.1。比保留
以及双边重叠,例如2.1.-6.1.已经预订和 1.1.- 10.1。或 3.1.-5.1。比保留。
Oracle 不支持 built-in 范围数据类型(据我所知)。因此,它没有 built-in 重叠功能。
为了执行这样的检查,您有两个选择:
- 创建一个 user-defined 函数来检查重叠。在检查约束中使用此函数。
- 编写检查重叠的触发器。
(由于变异 table 错误,第二个在 Oracle 中可能很棘手。)我认为您需要编写一个函数以在检查约束中使用。
我悬着一个问题
假设您是一家酒店的经理,酒店的数据库中有一个数据库
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));
Table 定义如下:
所以您不能在到达之前离开这家酒店。
更改此定义,以便您无法在到达日期与现有出发日期冲突的 table 中输入预订。 算作一次碰撞
两者单边重叠,例如3.1.-6.1.已经预订和 1.1.- 5.1。或 4.1.-10.1。比保留
以及双边重叠,例如2.1.-6.1.已经预订和 1.1.- 10.1。或 3.1.-5.1。比保留。
Oracle 不支持 built-in 范围数据类型(据我所知)。因此,它没有 built-in 重叠功能。
为了执行这样的检查,您有两个选择:
- 创建一个 user-defined 函数来检查重叠。在检查约束中使用此函数。
- 编写检查重叠的触发器。
(由于变异 table 错误,第二个在 Oracle 中可能很棘手。)我认为您需要编写一个函数以在检查约束中使用。