gpt4 book ai didi

MySQL:创建一个带有外键的表,该外键引用由外键组成的主键

转载 作者:行者123 更新时间:2023-11-29 23:04:10 25 4
gpt4 key购买 nike

我有一个图书表,其中存储图书 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)
);

最佳答案

您的 Rating 表上已有一个外键,该外键应将每个 Rating 行限制为与 Buys 行相对应。我想问题一定出在你的另一个目标上,即顾客不能对同一本书评价两次。就此而言,我猜您对外键有一个误解:它们在目标表上必须是唯一的,但它们在引用端并不自动必须是唯一的。

为了防止多个 Rating 行具有相同的 BookIDCustomerID 组合,您需要一个额外的 UNIQUE Rating 表上的约束,命名这些列。或者,您可以为 Rating 表指定一个由这些列组成的复合主键。无论哪种方式,您都会有单独的约束,一个约束建立引用表中这些列的唯一性,另一个将它们限制为出现在 Buys 表中的对。

关于MySQL:创建一个带有外键的表,该外键引用由外键组成的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28374226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com