我有一张书籍表,其中存储了书籍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