我有一張書籍表,其中存儲了書籍ID和標題,作者等,具有客戶ID的客戶表(PK),客戶姓名,生日。然後是一個交易表,其中包括BookId和CustomerID作爲外鍵。此事務表的主鍵是兩個外鍵列。MySQL:使用引用由外鍵組成的主鍵的外鍵創建表
現在的問題是,我正在創建基於發生的交易的書評分表(因此,客戶不能評價他們不擁有的書籍,或同一書籍兩次)。此表格必須包含bookID,客戶ID和評分信息。我試圖限制表,以便每個bookID和customerID行必須引用事務表中的現有行。但是,迄今爲止我嘗試過的所有限制都不起作用。任何幫助都將不勝感激。
這裏是我的表的那一刻:
CREATE TABLE eBook
( BookTitle VARCHAR(50),
BookID CHAR(13) NOT NULL,
BookPub CHAR(4) NOT NULL,
BookDate DATE NOT NULL,
BookHard BOOL NOT NULL,
BookSize INT NOT NULL,
CONSTRAINT PKBookID PRIMARY KEY (BookID)
);
CREATE TABLE customer
( CustID CHAR(9) NOT NULL,
CustSSN CHAR(11) NULL,
CustName VARCHAR(50) NOT NULL,
CustBirth INT(4) NOT NULL,
CONSTRAINT PKCustID PRIMARY KEY (CustID),
CONSTRAINT UniqSSN UNIQUE (CustSSN)
);
CREATE TABLE Buys
( BuysID CHAR(5) NOT NULL
BookID CHAR(13) NOT NULL,
CustID CHAR(9) NOT NULL,
TransDate DATETIME NOT NULL,
Price DECIMAL(5,2) NOT NULL,
CONSTRAINT FK1 FOREIGN KEY (BookID) REFERENCES eBook (BookID)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT FK2 FOREIGN KEY (CustID) REFERENCES customer (CustID)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT PKBuys PRIMARY KEY (BookID, CustID)
);
CREATE TABLE Rating
( BookID CHAR(13) NOT NULL,
CustID CHAR(9) NOT NULL,
RatingID CHAR(5) NOT NULL,
Rating INT(1) NOT NULL,
RatingDate DATE NOT NULL,
CONSTRAINT FK13 FOREIGN KEY (BookID, CustID) REFERENCES buys (BookID, CustID)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT PKRating PRIMARY KEY (RatingID)
);
不要忘記添加你的問題,你已經嘗試過(如在實際的創建表或查詢或任何可能),所以人們可以輕鬆地幫助你。 – Prix 2015-02-06 20:31:24
雖然有些人會認爲這不是最正確的方法,但我會做的只是將評級列添加到購買表。用戶可以通過這種方式對購買或不進行評級,但他們只能對自己的購買進行評級。 – mrunion 2015-02-06 20:36:50
在'Buys'表中有一個自動增量ID作爲主鍵可能會更好,並將它用作'Rating'表中的外鍵。您仍然可以在'(BookID,CustID)'上使用唯一的密鑰來防止重複購買。 – Barmar 2015-02-06 20:39:34