首页 > 解决方案 > 错误的外键每个主键值有很多值?

问题描述

我正在从Source Daddy的一个关于各种玩具制造商的示例中重新学习主键和外键:

CREATE TABLE Manufacturers
(
    ManufacturerID INTEGER CONSTRAINT ManfID PRIMARY KEY,
    ToyID INTEGER NOT NULL,
    CompanyName CHAR(50) NOT NULL,
    Address CHAR(50) NOT NULL,
    City CHAR(20) NOT NULL,
    State CHAR(2) NOT NULL,
    PostalCode CHAR(5) NOT NULL,
    AreaCode CHAR(3) NOT NULL,
    PhoneNumber CHAR(8) NOT NULL UNIQUE,

    CONSTRAINT ToyFk 
        FOREIGN KEY (ToyID) REFERENCES Toys (ToyID)
                ON UPDATE CASCADE
                ON DELETE CASCADE
);

虽然我不经常使用密钥,但我想我理解它们。我对上面的例子感到困惑。这是制造商表,还有另一张玩具表。我们可以期待将许多玩具映射到任何一个制造商。因此,在制造商表中包含玩具 ID 字段似乎没有意义,除非对于任何给定的制造商记录,该字段旨在包含玩具 ID 的集合。

当然,您可以使用字符串来执行此操作 [1],但此示例的目的似乎并不是将事物与奇怪的奇异示例混淆。

这些年来我是否对钥匙有惊人的误解?如果是这样,任何人都可以解释上述问题吗?

谢谢。

PS如果我是对的,那么错误完全混淆了下一页,它试图描述更新的方向CASCADE

[1] 或者在允许复杂单元格的 Matlab 中进行。

标签: sqlforeign-keyskeyprimary-keycascade

解决方案


(请原谅双关语)玩具问题的重点是具有直观和简单的语义,但这种设计没有,所以这是一个糟糕且令人困惑的例子。

SQL PK(主键)是您选择调用 PK 的一组唯一的 NOT NULL 列。SQL FK(外键)是一个列列表,其子行在其他地方显示为声明的 UNIQUE(可能是 PK)。声明 PK、UNIQUE NOT NULL、UNIQUE 和 FK,因为它们在其他声明未暗示时出现。此外,声明的 FK 必须是声明的 UNIQUE/PK,因此您必须声明这样的 UNIQUE/PK,即使它被其他声明暗示。DMBS 可能会出于其他目的使用 PK。


推荐阅读