Mysql 使用完整性增强功能预订表
我目前正试图解决一个问题,但我被困在一个点上。下面是给出的答案。我正在尝试使用integrity enhancement创建预订表,但在限制条件下,同一房间不能双重预订 酒店号、酒店名、城市客房号、酒店号、类型、价格预订酒店号、客人号、日期起、日期到、房间号客人号、客人名、客人服装,其中酒店包含酒店详细信息,酒店号是主键。Room包含每个酒店和roomNo的房间详细信息,HoteNo构成主键。Booking包含预订的详细信息,hoteINo、guestNo、dateFrom表单是主键。Guest包含Guest详细信息,guestNo是主键 我已经走了多远:Mysql 使用完整性增强功能预订表,mysql,sql,Mysql,Sql,我目前正试图解决一个问题,但我被困在一个点上。下面是给出的答案。我正在尝试使用integrity enhancement创建预订表,但在限制条件下,同一房间不能双重预订 酒店号、酒店名、城市客房号、酒店号、类型、价格预订酒店号、客人号、日期起、日期到、房间号客人号、客人名、客人服装,其中酒店包含酒店详细信息,酒店号是主键。Room包含每个酒店和roomNo的房间详细信息,HoteNo构成主键。Booking包含预订的详细信息,hoteINo、guestNo、dateFrom表单是主键。Guest
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级别,则通过数据库触发器应用它们,这样可以更好地处理事务和错误消息。