这些FK是否必要 - 他们会阻止我吗?

时间:2016-04-27 00:41:10

标签: sql postgresql ddl create-table

我在为夏令营创建的数据库遇到一些困难,特别是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消息以进一步澄清:

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

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

如果需要,还有更多的表(显然)可以提供create语句。

1 个答案:

答案 0 :(得分:0)

你应该从这里开始:Foreign key

  

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

您在脚本中尝试执行的操作是在人员,营员和辅导员之间创建循环链接。拥有主键字段外键还要求所有引用表中的ID相同。

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

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

相关问题