【问题标题】:Booking Table using integrity enhancement使用完整性增强的预订表
【发布时间】: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。但是,我建议将数据完整性约束保留在应用程序层,或者如果您想将其保留在数据库级别,然后通过数据库触发器应用它们,您可以更好地处理事务和错误消息。

标签: mysql sql


【解决方案1】:

我认为,您需要从 4 个字段的 Booking 进行 pk:hotelNo、guestNo、dateFrom、roomNo;并且您必须像这样修改 CONSTRAINT RoomBooked:

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, roomNo),
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 1
 FROM Booking b
 WHERE (
  isnull(b.dateTo, b.dateFrom) 
   between Booking.dateFrom and isnull(Booking.dateTo, Booking.dateFrom)
  or b.dateFrom 
   between Booking.dateFrom and isnull(Booking.dateTo, Booking.dateFrom))
 AND b.roomNo = Booking.roomNo 
 AND b.hotelNo = Booking.hotelNo)))

我想,一位客人可以预订一间以上的房间,因此您不能为 GuestBooked 设置 CONSTRAINT

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多