我有预订表,我想确保在同一天的同一间酒店没有两个预订。
我在下面写了表格查询。
Create table resevations
(
hotel_id varchar(10),
cus_id varchar(10),
room_id varchar(10),
date_from date,
date_to date,
primary_key(hotel_id,customer_id,date_from),
unique(hotel_id,room_id,date_from)
)
我不确定unique中列的组合是否可以做到。
答案 0 :(得分:1)
您最好的选择是手动处理验证。使用unique或keys将无法使用,因为您需要在日期范围内进行验证,而不仅仅是开始日期,因此从2018-02-01到2018-02-09预订房间将不会阻止您从2018年开始预订房间-02-03至2018-02-07,它们完全重叠,但日期不同。
SELECT 1 FROM resevations
WHERE (({startDate} BETWEEN date_from AND date_to OR {endDate} BETWEEN date_from AND date_to)
OR (date_from BETWEEN {startDate} AND {endDate} OR date_to BETWEEN {startDate} AND {endDate}))
AND hotel_id = {hotelID} AND room_id = {roomID} LIMIT 1
使用您尝试进行的预约填写花括号,如果它与现有预约重叠,则返回1(true),如果不重叠则不返回结果。一旦您返回错误或保存预订。
根据 Paul Spiegel 的建议,此查询的where子句更为简单,您只需检查该会议室的np预订在结束日期之前开始并在开始日期之后结束,其中任何重叠的保留都必须适用。
SELECT 1 FROM resevations
WHERE date_from <= {endDate} AND date_to >= {startDate}
AND hotel_id = {hotelID} AND room_id = {roomID} LIMIT 1
答案 1 :(得分:0)
根据定义主键是唯一的
因此,在您的情况下,我认为拥有一个组合主键(hotel_id, room_id, cutomer_id, date)
应该可以解决问题
这意味着预订对于一个酒店的一个客户和一个日期的一个房间是唯一的。
希望这有帮助