【问题标题】:PostgreSQL error, no unique constraint matching givenPostgreSQL 错误,没有给出唯一约束匹配
【发布时间】:2016-08-03 21:52:22
【问题描述】:

尝试创建一个数据库,该数据库允许一门课程有几个部分,一个部分有几个事件/时段,以了解他们何时相遇。一切都正确链接,但是我遇到了一个 PostgreSQL 错误的问题,我意识到它告诉我我需要“Sections”和“ClassEvent”表中的 UNIQUE 属性,但我不能让它们成为 UNIQUE,因为它是信息应该/可以重复。

删除表如果存在统计; DROP TABLE IF EXISTS ClassEvent; DROP TABLE IF EXISTS 注册; 如果存在 DegreeReq 则删除表; DROP TABLE IF EXISTS DegreeInstance; 如果存在部分,则删除表; 如果存在学生,则丢弃表; 如果存在学位,则删除表; 删除表如果存在教授; 如果存在人,则删除表; DROP TABLE IF EXISTS 课程; -- 在没有课程实例的情况下举办特定课程 -- 创建表课程( courseID SERIAL UNIQUE NOT NULL, 部门 VARCHAR(4) NOT NULL, courseNumber VARCHAR(5) NOT NULL, courseName TEXT UNIQUE NOT NULL, 积分 INT NOT NULL, 主键(课程 ID) ); -- 人超型 -- 创建表人( pid SERIAL UNIQUE NOT NULL, fname 文本不为空, lname TEXT NOT NULL, 主键(pid) ); -- 拥有不同的教授在学校任教 -- -- 人的亚型 -- 创建表教授( ProfessorID SERIAL UNIQUE NOT NULL, 状态文本不为空, 检查(状态='全职'或状态='兼职'), 主键(教授 ID) ); -- 持有取决于年份和期限的类的具体实例 -- 创建表部分( crn INT UNIQUE NOT NULL, courseID SERIAL REFERENCES Courses(courseID) NOT NULL, 年份 INT NOT NULL, 术语文本不为空, sectionNumber INT NOT NULL, 开始日期日期不为空, endDate 日期不为空, professorID INT REFERENCES Professors(professorID) UNIQUE NOT NULL, 主键(crn, courseID) ); -- 举办班级活动 -- -- 一个班级可能有不同的日子 -- ——他们见面了,所以这允许一定的—— -- 部分有几天没有冲突 -- 创建表类事件( crn INT REFERENCES Sections(crn) NOT NULL, year INT REFERENCES Sections(year) NOT NULL, term TEXT REFERENCES Sections(term) NOT NULL, professorID INT REFERENCES 教授(professorID)不为空, 日文本, 开始时间时间, endTime 时间, 位置文本, 校园文, CHECK(day = 'Monday' OR day = 'Tuesday' OR day = 'Wednesday' OR day = 'Thursday' OR day = 'Friday' OR day = 'Saturday' OR day = 'Sunday' OR day = NULL), 主键(crn,年份,期限) ); -- 持有将要上课的学生 -- -- 人的亚型 -- 创建表学生( 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) ); 插入课程(部门、课程编号、课程名称、学分) 价值观 ('CMPT', '120L', '编程入门', 4), ('CMPT', '220L', '软件开发 I', 4), ('CMPT', '221L', '软件开发 II', 4), ('CMPT', '230L', '软件系统 + 分析', 4), ('CMPT', '306N', '数据通信', 4), ('CMPT', '308L', '数据库管理', 4), ('CMPT', '307N', '互联网络', 4), ('CMPT', '330L', '系统设计', 4), ('CMPT','422L','计算机组织和架构',4), ('CMPT', '435L', '算法分析与设计', 4), ('CMPT', '424L', '操作系统', 4), ('CMPT', '432L', '编译器设计', 4), ('CMPT', '331L', '程序设计语言理论', 4), ('CMPT', '440L', '形式语言和可计算性', 4), ('CMPT', '333L', '语言学习', 4), ('CMPT', '475L', 'CS 项目 I', 4), ('CMPT', '476L', 'CS 项目 II', 4), ('BUS', '100N', 'Intro to Business & Management', 4), (“数学”,“130L”,“统计介绍 I”,3), ('数学','241L','微积分 I',4), ('数学','242L','微积分 II',4), ('FYS', '101L', '第一年研讨会', 4), ('ENG','120L','为大学写作',3), (“菲尔”,“101L”,“哲学观点”,3), ('MUS', '120L', '音乐理论 I', 3), ('ECON', '103L', '微观经济学原理', 3), ('ECON', '104L', '宏观经济学原理', 3), ('数学','343L','微积分 III',4), ('数学','310L','数学推理入门',3), ('CMPT', '416N', '网络安全简介', 4), ('CMPT', '446N', '计算机图形学', 4), ('CMPT','404L','人工智能',4), ('CMPT', '305L', '技术、伦理与社会', 3), ('CMPT', '192N', '竞争性编程', 1); 插入人员(fname,lname) 价值观 (“马科斯”,“巴比里”), (“詹姆斯”,“克劳利”), ('凯莉','教皇'), (“巴勃罗”,“里瓦斯”), (“马修”,“约翰逊”), ('安妮','马修斯'), (“乔”,“史密斯”), (“迈克”,“艾米特”), ('迈克尔·乔丹'), (“艾伦”,“劳工”); INSERT INTO Professors(professorID, status) 价值观 (4, '全职'), (5,“全职”), (6,“全职”), (7,“全职”), (10,“全职”); 插入部分(crn,courseID,year,term,sectionNumber,startDate,endDate,professorID) 价值观 (11111, 1, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 4), (11112, 1, 2016, '秋季', 112, '2016-08-29', '2016-12-15', 4), (11113, 1, 2016, '秋季', 113, '2016-08-29', '2016-12-15', 4), (11121, 2, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 5), (11122, 2, 2016, '秋季', 112, '2016-08-29', '2016-12-15', 5), (11123, 2, 2016, '秋季', 113, '2016-08-29', '2016-12-15', 5), (11211, 3, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 6), (11212, 3, 2016, '秋季', 112, '2016-08-29', '2016-12-15', 6), (11213, 3, 2016, '秋季', 113, '2016-08-29', '2016-12-15', 6), (11214, 4, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 7), (11215, 4, 2016, '秋季', 112, '2016-08-29', '2016-12-15', 7), (11216, 5, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 10), (11217, 6, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 10), (11118, 6, 2016, '秋季', 112, '2016-08-29', '2016-12-15', 4), (11119, 6, 2016, '秋季', 113, '2016-08-29', '2016-12-15', 5), (11120, 6, 2016, '秋季', 114, '2016-08-29', '2016-12-15', 4), (11200, 7, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 5), (11201, 7, 2016, '秋季', 112, '2016-08-29', '2016-12-15', 5), (11202, 8, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 10), (11203, 9, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 10), (11204, 10, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 6), (11205, 10, 2016, '秋季', 112, '2016-08-29', '2016-12-15', 6), (11206, 10, 2016, '秋季', 113, '2016-08-29', '2016-12-15', 6), (11207, 10, 2016, '秋季', 114, '2016-08-29', '2016-12-15', 6), (11208, 11, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 4), (11209, 11, 2016, '秋季', 112, '2016-08-29', '2016-12-15', 4), (11222, 12, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 4), (11333, 12, 2016, '秋季', 112, '2016-08-29', '2016-12-15', 5), (11445, 12, 2016, '秋季', 113, '2016-08-29', '2016-12-15', 7), (11111, 12, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 4), (11678, 13, 2016, '秋季', 111, '2016-08-29', '2016-12-15', 10), (11679, 13, 2016, '秋季', 112, '2016-08-29', '2016-12-15', 4); 选择 * 从部分;

我尝试这样做,但出现以下错误:

错误:没有唯一约束匹配引用表“节”的给定键
********** 错误 **********

错误:没有唯一约束匹配引用表“节”的给定键
SQL状态:42830

【问题讨论】:

    标签: sql database postgresql unique


    【解决方案1】:

    您不需要将年份和学期作为类事件表中的外键。此信息是多余的,因为它可以通过 crn 在sections 表中查找。我建议您将 ClassEvents 的创建语句更改如下:

    CREATE TABLE ClassEvent (
        crn         INT    REFERENCES Sections(crn)                  NOT NULL,        
        professorID INT    REFERENCES Professors(professorID)        NOT NULL,
        day         TEXT NOT NULL,
        startTime   TIME NOT NULL,
        endTime     TIME,
        location    TEXT,
        campus      TEXT,
        CHECK(day = 'Monday' OR day = 'Tuesday' OR day = 'Wednesday' OR day = 'Thursday' OR day = 'Friday' OR day = 'Saturday' OR day = 'Sunday' OR day = NULL),
        PRIMARY KEY(crn, day, startTime,professorID)
    );
    

    我已将主键更改为课程、日期/时间和教授的组合 - 因为教授不能在任何给定时间点教授超过课程。

    【讨论】:

    • 效果很好!谢谢!不过,我现在还有另一个问题。 PostgreSQL 告诉我,当我用诸如 4 之类的教授 ID 填充“Sections”时,会违反唯一约束。但是,如果我没有那个 ID,我就无法参考之前的表格。教授可以教授一门课程的几个部分。关于如何解决这个问题的任何想法?
    • 另外检查可能会失败:OR day = NULL 最好是OR day IS NULL,除非您将transform_null_equals 设置为 true,这不是默认设置
    • @ZiggyCrueltyfreeZeitgeister 谢谢你的建议,我会改变的。另一个问题,我能够修复,我只需要从“Sections”表中删除 UNIQUE。感谢大家的帮助!
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2017-08-26
    • 2012-08-11
    • 2021-06-24
    相关资源
    最近更新 更多