【发布时间】:2016-03-20 22:48:48
【问题描述】:
我目前正在尝试解决一个问题,但我被困在一个点上。以下是给出的来自。我正在尝试使用完整性增强创建 Booking 表,但在限制条件下,不能重复预订同一个房间。
Hotel (hotelNo, hotelName, city) Room (roomNo, hotelNo, type, price) Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo) Guest (guestNo, guestName, guestAddress) 其中Hotel 包含酒店详细信息,hotelNo 是首要的关键。 Room 包含每个酒店的房间详细信息,并且 (roomNo, hoteINo) 构成主键。 Booking 包含预订的详细信息,并且 (hoteINo, guestNo, dateFrom) 构成主键。 Guest 包含客人详细信息,guestNo 是主键..
这是我走了多远:
CREATE TABLE Booking(
hotelNo HotelNumbers NOT NULL,
guestNo GuestNumbers NOT NULL,
dateFrom BookingDate NOT NULL,
dateTo BookingDate NULL,
roomNo RoomNumber NOT NULL,
PRIMARY KEY (hotelNo, guestNo, dateFrom),
FOREIGN KEY (hotelNo) REFERENCES Hotel
ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (guestNo) REFERENCES Guest
ON DELETE NO ACTION ON UPDATE CASCADE,
FOREIGN KEY (hotelNo, roomNo) REFERENCES Room
ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT RoomBooked
CHECK (NOT EXISTS ( SELECT *
FROM Booking b
WHERE b.dateTo > Booking.dateFrom AND
b.dateFrom < Booking.dateTo AND
b.roomNo = Booking.roomNo AND
b.hotelNo = Booking.hotelNo)),
CONSTRAINT GuestBooked
CHECK (NOT EXISTS ( ...............)
【问题讨论】:
-
这是否允许 - 在检查约束中有子查询?我知道 SQL Server 不允许这样做,不确定 MySQL。但是,我建议将数据完整性约束保留在应用程序层,或者如果您想将其保留在数据库级别,然后通过数据库触发器应用它们,您可以更好地处理事务和错误消息。