我在为夏令营创建的数据库遇到一些困难,特别是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语句。
答案 0 :(得分:0)
你应该从这里开始:Foreign key。
在关系数据库的上下文中,外键是一个字段(或 一个表中唯一标识一行的字段集合 另一张桌子。
您在脚本中尝试执行的操作是在人员,营员和辅导员之间创建循环链接。拥有主键字段外键还要求所有引用表中的ID相同。
...并且要创建外键,引用的表必须已存在于数据库中。因此,您应该从没有任何外键的表开始,并创建仅引用先前创建的表的表。或者,您可以创建所有没有外键的表,并在所有表存在时添加它们。
...并回答这个问题,外键从来都不是必需的,但它们可能有所帮助。