【问题标题】:Are these FKs necessary -- and are they stopping me?这些 FK 是否必要——它们是否阻止了我?
【发布时间】:2016-04-27 00:41:10
【问题描述】:

我为夏令营创建的数据库遇到了一些困难,特别是在 PK 和 FK 约束方面。当我声明 FK 约束(例如 FOREIGN KEY(PID) 引用 Campers(CamperID))时,我通过 pgAdmin 运行我的代码时遇到错误(我正在使用 PostgreSQL)。我知道,例如,尚未创建 Campers 表,这很可能是部分/全部障碍,但我觉得我的 FK 仍然以某种方式出错。据我了解,FK 是另一个表中的 PK - 但我觉得我的表之间存在一些冗余或断开连接。

我将一些 CREATE 语句的语法放在下面。我不确定我是否会因为我的(有点模糊)问题的质量而受到谴责,但我感到有点失落,并希望得到任何帮助或建议。提前谢谢!

DROP TABLE IF EXISTS People;
CREATE TABLE People (
    PID                 VARCHAR(10) NOT NULL            UNIQUE,
    FName               TEXT                NOT NULL,
    LName                   TEXT                NOT NULL,
    DOB                     DATE                NOT NULL,
    ArrivalDate     DATE                NOT NULL            DEFAULT CURRENT_DATE,
    DepartureDate       DATE,               
    US_PhoneNum         VARCHAR(11)     NOT NULL,
    StreetAddress       VARCHAR(200)    NOT NULL,
    Sex                 GENDER          NOT NULL,
    ZIP                 VARCHAR(10) NOT NULL,
PRIMARY KEY(PID),
FOREIGN KEY(PID) REFERENCES Campers(CamperID),
FOREIGN KEY(PID) REFERENCES Counselors(CounselorID),
FOREIGN KEY(ZIP) REFERENCES Zip(ZIP)
);

DROP TABLE IF EXISTS Zip;
CREATE TABLE Zip (
    ZIP     VARCHAR(10) NOT NULL,
    City        TEXT                NOT NULL,
    State       VARCHAR(2)      NOT NULL,
    PRIMARY KEY(ZIP)
);

DROP TABLE IF EXISTS Campers;
CREATE TABLE Campers (
    CamperID        VARCHAR(10) NOT NULL REFERENCES People(PID),
    AgeGroup        AGES                NOT NULL,
    CabinID     VARCHAR(2)      NOT NULL,
    Bed         BEDTYPES            NOT NULL,
    GroupID     VARCHAR(3)      NOT NULL,
    PRIMARY KEY(CamperID),
    FOREIGN KEY(CamperID) REFERENCES People(PID),
    FOREIGN KEY(CabinID)  REFERENCES Cabins(CabinID),
    FOREIGN KEY(Bed)      REFERENCES Beds(Bed),
    FOREIGN KEY(GroupID)  REFERENCES Groups(GroupID)
);

DROP TABLE IF EXISTS Counselors;
CREATE TABLE Counselors (
    CounselorID VARCHAR(10) NOT NULL REFERENCES People(PID),
    GroupID         VARCHAR(3)      NOT NULL,
    CabinID         VARCHAR(2)      NOT NULL,
    PRIMARY KEY(CounselorID),
    FOREIGN KEY(GroupID) REFERENCES Groups(GroupID),
    FOREIGN KEY(CabinID) REFERENCES Cabins(CabinID)
);

用于进一步说明的错误消息:

ERROR:  relation "campers" does not exist
********** Error **********

ERROR: relation "campers" does not exist
SQL state: 42P01

如果需要,我可以提供更多表(显然),我可以为其提供创建语句。

【问题讨论】:

  • Campers 中的 REFERENCES People(PID) 是您想要的 FK,而不是 people 中的外键 (PID) REFERENCES Campers(CamperID)`。如果您在列定义中有REFERENCES,那么您不需要在表级别使用单独的FOREIGN KEY
  • 太好了,我不知道!谢谢@muistooshort。
  • 哪个语句会引发该错误?

标签: sql postgresql ddl create-table


【解决方案1】:

你真的应该从这里开始:Foreign key

在关系数据库的上下文中,外键是一个字段(或 字段集合)在一个表中唯一标识一行 另一个表。

您在脚本中尝试做的是在人员、营员和辅导员之间创建一个循环链接。具有主键字段和外键要求所有引用表中的 ID 相同。

...并且要创建外键,引用的表必须已经存在于数据库中。因此,您应该从没有任何外键的表开始,并创建仅引用之前创建的表的表。或者,您可以创建没有外键的所有表,然后在所有表都存在时添加它们。

...为了回答这个问题,外键从来都不是必需的,但它们可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-10-11
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多