1. 程式人生 > >資料庫第八次作業建表,儲存過程和檢視舉例

資料庫第八次作業建表,儲存過程和檢視舉例

1)用DDL寫出Booking表的定義,包括主鍵,外來鍵,域約束。**

主鍵由三個欄位組成,外來鍵來自多個表,分開寫更清晰, 域約束用check來限制,另外一種方法是用Domain,在建表之前就限制

CREATE TABLE Booking(
hotelNo INT NOT NULL,
guestNo INT NOT NULL,
dateFrom DATE NOT NULL CHECK (dateFrom>=CURRENT_DATE),
dateTo DATE CHECK(dateTo>dateFrom));
roomNo INT NOT NULL,
PRIMARY KEY(hotelNo,guestNo,dateFrom)
FOREIGN KEY(hotelNo) REFERENCES hotel(holtelNo),
FOREIGN KEY(guestNo) REFERENCES guest(guestNo),
FOREIGN KEY(roomNo) REFERENCES room(roomNo)
); 

由於沒有其他表,暫時無法寫外來鍵語句 在這裡插入圖片描述 但是,在mysql中也可以插入不符合條件的三個語句,也就是會出現dateTo<dateFrom,dateFrom<CURRENT_DATE的情況 在這裡插入圖片描述 在這裡插入圖片描述 查過發現 mysql所有的儲存引擎均不支援check約束,MySQL會對check子句進行分析,但是在插入資料時會忽略,因此check並不起作用,因此實現對資料約束有兩種方法:

1.在mysql種約束,如使用enum型別或者觸發器等。 2.在應用程式裡面對資料進行檢查再插入。

2)寫出一個儲存過程,求某個時間段(住宿時間),某個賓館,某種房間可預訂的房間號碼;

傳入四個引數,注意dateFrom和dateTo的大小關係即可

DELIMITER //
CREATE PROCEDURE telnumber (
IN hotelNo INT,
IN type VARCHAR(1),
IN dateFrom DATE,
IN dateTo DATE
)
BEGIN
SELECT roomNo FROM room  
WHERE [email protected] AND [email protected] AND roomNo NOT IN(
SELECT roomNo FROM Booking WHERE [email protected] AND dateFrom<[email protected]
AND dateTo>=dateFrom); END // DELIMITER ;

在這裡插入圖片描述 注意:另一種關於引數的寫法

@hotelNo IN INT,
@type IN VARCHAR(1),
@dateFrom IN DATE,
@dateTo IN DATE

是sqlserver的寫法,mysql中識別不了會報錯

3)寫出一個檢視,求2018年11月shelldon酒店每個房間利潤從大到小排列

說明: 1每個房間可能被多次預定 2預定跨月的房間按dateFrom為主

CREATE VIEW profit_sigroom(roomNo,NoverProfit) AS
SELECT roomNo,SUM(price) 
FROM hotel h,room r,booking b
WHERE h.hotelname=’shelldon’ AND h.hotelNo=r.hotelNo AND h.hotelNo=b.hotelNo
AND dateFrom>=’2018-11-01’ AND dateFrom<=’2018-11-30’
GROUP BY roomNo DESC;