正在用 SQL 創建一些表并在我不得不設計以下表時卡住了:

如您所見,無法在沒有客戶收據表的情況下創建房間詳細資訊和服務詳細資訊表,因為它們包含 Receipt_no 作為主鍵。
同樣,如果不先創建兩個明細表,就不可能創建沒有 Room_charges 和 Service_charges 屬性的 Customer Receipt 表。
因此,我首先創建一個客戶回執表,但沒有FK制約Room_Charges和Service_charges,然后我創建服務細節和客房明細表。
后來,使用 ALTER 命令,我嘗試在客戶收據表上添加 FK 約束,但它給了我這個錯誤
ORA-02270: 此列串列沒有匹配的唯一鍵或主鍵
現在,在 StackOverflow 上對它進行了一些研究之后,可能有批準的答案中提到的三種可能的情況(@ Oracle (ORA-02270) :此列串列錯誤沒有匹配的唯一鍵或主鍵)
我認為我的案例排名第 3,因為我已確保實施前兩個案例。
有人可以幫我解決嗎?
我附上 SQL 代碼作為參考:
CREATE TABLE Customer_Receipt
(
Receipt_no VARCHAR2(12) PRIMARY KEY,
Booking_no NUMBER NOT NULL,
Total_charges NUMBER(12,2),
CONSTRAINT bookingnocustrec
FOREIGN KEY(Booking_no) REFERENCES Room_booking (Booking_no)
);
CREATE TABLE Services_Details
(
Receipt_no VARCHAR2(12) NOT NULL,
Service_offered VARCHAR2(8) NOT NULL,
Service_charges NUMBER(12,2),
PRIMARY KEY(Receipt_no, Service_offered),
CONSTRAINT recno
FOREIGN KEY(Receipt_no) REFERENCES Customer_receipt (Receipt_no)
);
ALTER TABLE Services_Details
MODIFY Service_charges NOT NULL;
CREATE TABLE Room_Details
(
Receipt_no VARCHAR2(12) NOT NULL,
Category_name VARCHAR2(9) NOT NULL,
Days_stayed INT,
Room_charges NUMBER(12,2),
PRIMARY KEY(Receipt_no, Category_name),
CONSTRAINT recno1
FOREIGN KEY(Receipt_no) REFERENCES Customer_receipt (Receipt_no),
CONSTRAINT catname1
FOREIGN KEY(Category_name) REFERENCES Room_category (Category_name)
);
ALTER TABLE Customer_receipt
ADD Room_charges NUMBER(12,2) NOT NULL;
ALTER TABLE Customer_receipt
ADD CONSTRAINT FK_RC
FOREIGN KEY (Room_charges) REFERENCES Room_Details (Room_charges);
uj5u.com熱心網友回復:
作為框架挑戰。
有人可以幫我解決嗎?
是的,不要違反第三范式,也不要通過存盤 Total_Charges,Service_Charges或者Room_Charges在Customer_Receipt資料已經存盤在Service_Details和Room_Details表中的情況下復制資料。
如果您在兩個位置存盤相同的資料,那么您可能會遇到這兩個位置之間的資料不一致的情況;只需將每條資料存盤在一個位置,這樣您的資料庫中就有一個單一的真實來源。
CREATE TABLE Customer_Receipt
(
Receipt_no VARCHAR2(12)
CONSTRAINT custreceipt__recno__pk PRIMARY KEY,
Booking_no CONSTRAINT custreceipt__bookingno__fk REFERENCES Room_booking
NOT NULL
);
CREATE TABLE Services_Details
(
Receipt_no CONSTRAINT servicedetails__recno__fk REFERENCES Customer_receipt
NOT NULL,
Service_offered VARCHAR2(8)
NOT NULL,
Service_charges NUMBER(12,2),
CONSTRAINT servicedetails__recno_servoff__pk PRIMARY KEY(Receipt_no, Service_offered)
);
CREATE TABLE Room_Details
(
Receipt_no CONSTRAINT roomdetails__recno__fk REFERENCES Customer_receipt
NOT NULL,
Category_name CONSTRAINT roomdetails__catname__fk REFERENCES Room_category
NOT NULL,
Days_stayed INT,
Room_charges NUMBER(12,2),
CONSTRAINT roomdetails__recno_catname__pk PRIMARY KEY(Receipt_no, Category_name)
);
如果你想顯示的Total_Charges,Service_Charges并Room_Charges再利用JOIN,并從相關表獲取資料。就像是:
SELECT cr.*,
COALESCE(s.service_charges, 0) AS service_charges,
COALESCE(r.room_charges, 0) AS room_charges,
COALESCE(s.service_charges, 0) COALESCE(r.room_charges, 0)
AS total_charges
FROM customer_receipt cr
LEFT OUTER JOIN (
SELECT receipt_no,
SUM(service_charges) AS service_charges
FROM services_details
GROUP BY receipt_no
) s
ON cr.receipt_no = s.receipt_no
LEFT OUTER JOIN (
SELECT receipt_no,
SUM(days_stayed * room_charges) AS room_charges
FROM room_details
GROUP BY receipt_no
) r
ON cr.receipt_no = r.receipt_no;
或者創建一個視圖(或物化視圖)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/373077.html
