每个主键值有错误的外键值很多?

时间:2019-05-08 02:31:10

标签: sql foreign-keys key primary-key cascade

我正在从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],但是此示例的目的似乎并不是将事物与奇怪的奇特示例混淆。

这些年来,我是否对按键进行了令人惊讶的误解?如果是这样,有人可以解决以上问题吗?

谢谢。

P.S。如果我是对的,那么错误将使next page完全混乱,后者试图描述CASCADE引起的更新方向。

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

1 个答案:

答案 0 :(得分:1)

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

SQL PK(主键)是您选择调用PK的一些唯一的NOT NULL列。 SQL FK(外键)是一个列列表,其子行在其他地方显示为已声明的UNIQUE(可能是PK)。声明PK,UNIQUE NOT NULL,UNIQUE和FK,因为它们在其他声明中没有暗示时会出现。同样,已声明的FK必须属于已声明的UNIQUE / PK,因此,即使其他声明隐含了此声明,您也必须声明该UNIQUE / PK。 DMBS可能将PK用于其他目的。