【发布时间】:2016-08-08 16:03:27
【问题描述】:
我正在尝试为注册系统创建一个数据库。但是,我遇到了某些表没有唯一键的问题。我无法制作人工密钥,因为这会破坏数据库的完整性(在弱实体中使用人工密钥不是最佳做法)。如何在“Sections”表中修复此错误,以使“ClassEvents”中的行唯一?
-- 在没有课程实例的情况下举办特定课程 -- 创建表课程( courseID SERIAL UNIQUE NOT NULL, 部门文本不为空, courseNumber VARCHAR(10) NOT NULL, courseName TEXT NOT NULL, 积分 INT NOT NULL, 主键(部门,课程ID) ); -- 人超型 -- 创建表人( pid SERIAL UNIQUE NOT NULL, fname 文本不为空, lname TEXT NOT NULL, 主键(pid) ); -- 拥有不同的教授在学校任教 -- -- 人的亚型 -- 创建表教授( 教授ID INT UNIQUE NOT NULL, 状态文本不为空, 检查(状态='全职'或状态='兼职'), 主键(教授 ID), 外键(professorID) 参考人物(pid) ); -- 持有取决于年份和期限的类的具体实例 -- 创建表部分( 部门文本不为空, courseID INT UNIQUE NOT NULL, 年份 INT NOT NULL, 术语文本不为空, sectionNumber INT NOT NULL, 开始日期日期不为空, endDate 日期不为空, 主键(部门、课程 ID、部门编号、年份、学期)、 FOREIGN KEY(department, courseID) 参考 Courses(department, courseID) ); -- 举办班级活动 -- -- 一个班级可能有不同的日子 -- ——他们见面了,所以这允许一定的—— -- 部分有几天没有冲突 -- 创建表类事件( 教授ID INT UNIQUE NOT NULL, courseID INT UNIQUE NOT NULL, sectionNumber INT NOT NULL, 年份 INT NOT NULL, 术语文本不为空, 日文本, 开始时间时间, endTime 时间, 位置文本, 校园文, 检查(day = 'Monday' OR day = 'Tuesday' OR day = 'Wednesday' OR day = 'Thursday' OR day = 'Friday' OR day = 'Saturday' OR day = 'Sunday' OR day IS NULL), PRIMARY KEY(professorID, courseID, sectionNumber, year, term, day, startTime, endTime), FOREIGN KEY(professorID) REFERENCES 教授(professorID), 外键(courseID、sectionNumber、year、term) 参考 Sections(courseID、sectionNumber、year、term) ); -- 持有将要上课的学生 -- -- 人的亚型 -- 创建表学生( studentID INT REFERENCES People(pid) UNIQUE NOT NULL, 学生姓名文本不为空, 毕业年份日期唯一不为空, 主键(学生 ID) ); -- 拥有学生(可能还有教授)的一流记录 -- 创建表注册 ( studentID INT REFERENCES Students(studentID) UNIQUE NOT NULL, crn INT REFERENCES Sections(crn) NOT NULL, 等级文本不为空, 主键(学生 ID,crn) ); -- 拥有可以在学院/大学获得的不同学位 -- 创建表度数( degreeID SERIAL UNIQUE NOT NULL, 学位名称文本不为空, degreeType TEXT NOT NULL, degDepartment VARCHAR(4) 非空, 检查(degreeType = 'Major' OR degreeType = 'Minor' OR degreeType = 'Masters'), 主键(学位 ID) ); -- 开设学位课程 -- 创建表 DegreeReq ( degreeID INT REFERENCES Degrees(degreeID) UNIQUE NOT NULL, courseID INT REFERENCES Courses(courseID) UNIQUE NOT NULL, 主键(学位 ID,课程 ID) ); -- 持有特定学生的学位 -- -- 例如:一个学生可以有一个主修和一个辅修 -- -- 这样他/她就可以单独存放它们 -- 创建表学位实例( degreeID INT REFERENCES Degrees(degreeID) UNIQUE NOT NULL, studentID INT REFERENCES Students(studentID) UNIQUE NOT NULL, 开始日期日期不为空, endDate 日期不为空, creditsRequired INT NOT NULL, 主键(学位ID,学生ID) ); -- 持有我教授统计的所有费率 -- 创建表统计信息( professorID INT REFERENCES Professors(professorID) UNIQUE NOT NULL, dateSubmitted TIMESTAMP UNIQUE NOT NULL, 评级浮动不为空, 帮助 FLOAT NOT NULL, 清晰度浮点非空, 容易浮动不为空, 主键(professorID, dateSubmitted) ); 错误:没有唯一约束匹配引用表“节”的给定键 ********** 错误 ********** 错误:没有唯一约束匹配引用表“节”的给定键 SQL 状态:42830【问题讨论】:
-
为什么复合主键中有一个串行列?这没有意义。
-
为什么没有意义?我是数据库新手,所以我正在尽力而为,但我很确定强实体可以拥有人工密钥。 @GordonLinoff
-
@MBarbieri 。 . .连续列在每一行上都是唯一的。没有理由在主键中包含其他列。
-
@GordonLinoff...哦,我明白你的意思了,是的,这是有道理的。谢谢。
标签: sql database postgresql referential-integrity