【发布时间】:2015-02-06 20:28:48
【问题描述】:
我有一个书籍表,其中存储书籍 ID 和标题、作者等,还有一个包含客户 ID (PK)、客户姓名、生日的客户表。然后是一个事务表,其中包括 BookId 和 CustomerID 作为外键。这个事务表的主键是两个外键列。
现在的问题是我正在创建一个基于已发生交易的图书评级表(因此客户无法对他们不拥有的图书或同一本书进行两次评级。)。此表必须包含 bookID、customerID 和评级信息。我试图约束表,以便每个 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)
);
【问题讨论】:
-
不要忘记将您尝试过的内容添加到您的问题中(如在实际创建表或查询中或任何可能的内容中),以便人们可以轻松地帮助您。
-
虽然有些人会认为这不是最正确的方法,但我会做的只是将评级列添加到 Buys 表中。这样,用户可以对购买或不购买进行评分,但他们只能对自己的购买进行评分。
-
在
Buys表中使用自增ID 作为主键,并在Rating表中使用它作为外键可能会更好。您仍然可以在(BookID, CustID)上拥有唯一密钥,以防止重复购买。