我有一个包含2个表的数据库(主键用斜体表示(:
- 房间(ROOM_ID,天,小时(
- 预订(CUSTOMER_ID,ROOM_ID,日期(
第一张表描述了客房供应情况和客户的第二次预订情况。
现在假设我已经在ROOM
:中插入了3行
3898 WEDNESDAY 2.00
3454 MONDAY 1.00
3563 MONDAY 1.00
并且两行进入RESERVATION
:
0898 3454 05-09-2019
0567 3898 05-08-2019
现在我想创建一个约束,不允许已经预订房间的客户同时预订另一个可用的房间!
然后,如果我尝试插入:
0567 3563 05-10-2019
我会得到一个错误,因为根据第一张桌子,3454和3563房间都是1.00。
谢谢!
现在我想创建一个约束,不允许已经预订房间的客户同时预订另一个可用的房间。
我认为这是指客户在每个日期只能预订一个房间。如果是这样,您可以使用(customer_id
,date
(上的reservation
中的唯一索引/约束:
create unique index unq_reservation_customer_date on reservation(customer_id, date);
这保证了给定的客户在每个日期只能预订一个房间。
我可以看到两种创建真正约束的方法:
- 您创建两个表的物化视图,并在此视图上添加唯一索引
- 将ROOM_DAY和ROOM_HOUR列添加到RESERVATION表中,然后添加复合外键约束以强制数据完整性:
ALTER TABLE RESERVATION WITH CHECK ADD CONSTRAINT FK_RESERVATION_ROOM FOREIGN KEY(ROOM_ID, ROOM_DAY, ROOM_HOUR) REFERENCES ROOM (ROOM_ID, DAY, HOUR)
注意您也必须启用它。然后可以在RESERVATION表上添加唯一索引。