Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用完整性增强功能预订表_Mysql_Sql - Fatal编程技术网

Mysql 使用完整性增强功能预订表

Mysql 使用完整性增强功能预订表,mysql,sql,Mysql,Sql,我目前正试图解决一个问题,但我被困在一个点上。下面是给出的答案。我正在尝试使用integrity enhancement创建预订表,但在限制条件下,同一房间不能双重预订 酒店号、酒店名、城市客房号、酒店号、类型、价格预订酒店号、客人号、日期起、日期到、房间号客人号、客人名、客人服装,其中酒店包含酒店详细信息,酒店号是主键。Room包含每个酒店和roomNo的房间详细信息,HoteNo构成主键。Booking包含预订的详细信息,hoteINo、guestNo、dateFrom表单是主键。Guest

我目前正试图解决一个问题,但我被困在一个点上。下面是给出的答案。我正在尝试使用integrity enhancement创建预订表,但在限制条件下,同一房间不能双重预订

酒店号、酒店名、城市客房号、酒店号、类型、价格预订酒店号、客人号、日期起、日期到、房间号客人号、客人名、客人服装,其中酒店包含酒店详细信息,酒店号是主键。Room包含每个酒店和roomNo的房间详细信息,HoteNo构成主键。Booking包含预订的详细信息,hoteINo、guestNo、dateFrom表单是主键。Guest包含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 ( ...............)

我认为,您需要从4个字段进行pk预订:hotelNo、guestNo、dateFrom、roomNo;您必须修改约束条件,如下所示:

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)))

我想,一个客人可以预订多个房间,所以你不能为客人预订设置约束

这是允许的吗?在检查约束中有子查询?我知道SQL Server不允许,但不确定MySQL是否允许。但是,我建议将数据完整性约束保持在应用程序层,或者如果希望保持在DB级别,则通过数据库触发器应用它们,这样可以更好地处理事务和错误消息。