【问题标题】:PostgreSQL Error: there is not unique constraint matching given keys for referenced tablePostgreSQL错误:引用表的给定键没有唯一约束匹配
【发布时间】:2016-08-13 22:09:03
【问题描述】:

我正在创建一个用于注册课程的数据库,但我在使用“注册”表时遇到了问题。我需要将部分中的所有主键传递到注册中,但我还想传递一个附加键(“sectionNumber”)。但是,我不想将“sectionNumber”作为“Sections”的主键的一部分,因为我不想将 sectionNumber 传递到我具有来自“Sections”的外键的每个表中。有人对如何解决这个问题有任何建议吗?我不断收到以下错误。

-- 在没有课程实例的情况下举办特定课程 -- 创建表课程( courseID SERIAL UNIQUE NOT NULL, 部门文本不为空, courseNumber VARCHAR(10) NOT NULL, courseName TEXT UNIQUE 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 NOT NULL, 年份 INT NOT NULL, 术语文本不为空, sectionNumber INT NOT NULL, 开始日期日期不为空, endDate 日期不为空, crn INT 非空, 检查(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'), 主键(课程ID,年份,学期), 外键(courseID) 参考课程(courseID) ); -- 举办班级活动 -- -- 一个班级可能有不同的日子 -- ——他们见面了,所以这允许一定的—— -- 部分有几天没有冲突 -- 创建表类事件( 教授ID INT UNIQUE NOT NULL, courseID 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), 检查(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'), 主键(professorID, courseID, year, term, day, startTime, endTime), FOREIGN KEY(professorID) REFERENCES 教授(professorID), FOREIGN KEY(courseID, year, term) REFERENCES Sections(courseID, year, term) ); -- 生成先决条件 -- 创建表先决条件( courseID INT NOT NULL, 年份 INT NOT NULL, 术语文本不为空, prereqID INT NOT NULL, 检查(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'), 主键(courseID、年份、学期、prereqID)、 FOREIGN KEY(courseID, year, term) REFERENCES Sections(courseID, year, term), 外键(prereqID) 参考课程(courseID) ); -- 持有将要上课的学生 -- -- 人的亚型 -- 创建表学生( studentID INT REFERENCES People(pid) UNIQUE NOT NULL, 学生姓名文本不为空, 毕业年份日期唯一不为空, 主键(学生 ID) ); -- 拥有学生(可能还有教授)的一流记录 -- 创建表注册 ( studentID INT UNIQUE NOT NULL, courseID INT NOT NULL, 年份 INT NOT NULL, 术语文本不为空, sectionNumber INT NOT NULL, 等级文本, 检查(等级='A'或等级='A-'或等级='B+'或等级='B'​​或等级='B-'或等级='C+'或等级='C'或等级='C -' 或等级 = 'D+' 或等级 = 'D' 或等级 = 'D-' 或等级 = 'F' 或等级 = 'P/F'), 检查(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'), 主键(studentID, courseID, year, term, sectionNumber), 外键(studentID)参考学生(studentID), FOREIGN KEY(courseID, year, term) REFERENCES Sections(courseID, year, term), 外键(sectionNumber) 参考 Sections(sectionNumber) ); -- 拥有可以在学院/大学获得的不同学位 -- 创建表度数( 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) 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) ); -- 持有我教授统计的所有费率 -- 创建表评级 ( 教授ID INT UNIQUE NOT NULL, rmpID BIGINT UNIQUE NOT NULL, avgRating FLOAT NOT NULL, avgHelpfulness FLOAT NOT NULL, avgClarity FLOAT NOT NULL, avgEasiness FLOAT NOT NULL, 主键(professorID, rmpID), FOREIGN KEY(professorID) REFERENCES 教授(professorID) ); 错误:没有唯一约束匹配引用表“节”的给定键 ********** 错误 ********** 错误:没有唯一约束匹配引用表“节”的给定键 SQL 状态:42830

【问题讨论】:

    标签: sql postgresql foreign-keys referential-integrity


    【解决方案1】:

    您已声明此关系:

    FOREIGN KEY(sectionNumber) REFERENCES Sections(sectionNumber)
    

    sectionnumber 未声明为唯一的。您需要修复数据结构或使用主键。

    【讨论】:

    • 谢谢!将尝试实现另一个表,以便我可以将 sectionNumber 存储为主键。
    • @M.Barbieri。 . .如果它是唯一的,您可以在您现在拥有它的表中声明为唯一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2012-08-11
    • 2021-06-24
    • 2014-12-23
    相关资源
    最近更新 更多