PostgreSQL Error: there is not unique constraint matching given keys for referenced table
PostgreSQL Error: there is not unique constraint matching given keys for referenced table
我正在为 类 的注册创建一个数据库,但我在使用 "Enrollment" table 时遇到了问题。我需要将所有主键从部分传递到注册中,但我还想传递一个附加键 ("sectionNumber")。但是,我不想让 "sectionNumber" 成为 "Sections" 的主键的一部分,因为我不想将 sectionNumber 传递到每个 table 我有外键的地方来自 "Sections." 有人对如何解决这个问题有任何建议吗?我一直收到以下错误。
-- HOLDS A SPECIFIC COURSE WITHOUT THE INSTANCES OF THE CLASS --
CREATE TABLE Courses (
courseID SERIAL UNIQUE NOT NULL,
department TEXT NOT NULL,
courseNumber VARCHAR(10) NOT NULL,
courseName TEXT UNIQUE NOT NULL,
credits INT NOT NULL,
PRIMARY KEY(courseID)
);
-- PEOPLE SUPERTYPE --
CREATE TABLE People (
pid SERIAL UNIQUE NOT NULL,
fname TEXT NOT NULL,
lname TEXT NOT NULL,
PRIMARY KEY(pid)
);
-- HOLDS THE DIFFERENT PROFESSORS TEACHING AT THE SCHOOL --
-- SUBTYPE OF PEOPLE --
CREATE TABLE Professors (
professorID INT UNIQUE NOT NULL,
status TEXT NOT NULL,
CHECK(status = 'Full-Time' OR status = 'Part-time'),
PRIMARY KEY(professorID),
FOREIGN KEY(professorID) REFERENCES People(pid)
);
-- HOLDS THE SPECIFIC INSTANCES OF THE CLASS DEPENDING ON THE YEAR AND TERM --
CREATE TABLE Sections (
courseID INT NOT NULL,
year INT NOT NULL,
term TEXT NOT NULL,
sectionNumber INT NOT NULL,
startDate DATE NOT NULL,
endDate DATE NOT NULL,
crn INT NOT NULL,
CHECK(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'),
PRIMARY KEY(courseID, year, term),
FOREIGN KEY(courseID) REFERENCES Courses(courseID)
);
-- HOLDS THE EVENT OF THE CLASS --
-- A CLASS MAY HAVE DIFFERENT DAYS ON WHICH --
-- THEY MEET ON, SO THIS ALLOWS A CERTAIN --
-- SECTION TO HAVE SEVERAL DAYS WITHOUT CONFLICT --
CREATE TABLE ClassEvent (
professorID INT UNIQUE NOT NULL,
courseID INT NOT NULL,
year INT NOT NULL,
term TEXT NOT NULL,
day TEXT,
startTime TIME,
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 IS NULL),
CHECK(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'),
PRIMARY KEY(professorID, courseID, year, term, day, startTime, endTime),
FOREIGN KEY(professorID) REFERENCES Professors(professorID),
FOREIGN KEY(courseID, year, term) REFERENCES Sections(courseID, year, term)
);
-- GENERATES THE PREREQUESITES --
CREATE TABLE Prerequisites (
courseID INT NOT NULL,
year INT NOT NULL,
term TEXT NOT NULL,
prereqID INT NOT NULL,
CHECK(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'),
PRIMARY KEY(courseID, year, term, prereqID),
FOREIGN KEY(courseID, year, term) REFERENCES Sections(courseID, year, term),
FOREIGN KEY(prereqID) REFERENCES Courses(courseID)
);
-- HOLDS THE STUDENTS THAT WILL BE TAKING THE CLASSES --
-- SUBTYPE OF PEOPLE --
CREATE TABLE Students (
studentID INT REFERENCES People(pid) UNIQUE NOT NULL,
studentName TEXT NOT NULL,
gradYear DATE UNIQUE NOT NULL,
PRIMARY KEY(studentID)
);
-- HOLDS A CLASS RECORD FOR STUDENTS (AND POSSIBLY PROFESSORS) --
CREATE TABLE Enrollment (
studentID INT UNIQUE NOT NULL,
courseID INT NOT NULL,
year INT NOT NULL,
term TEXT NOT NULL,
sectionNumber INT NOT NULL,
grade TEXT,
CHECK(grade = 'A' OR grade = 'A-' OR grade = 'B+' OR grade = 'B' OR grade = 'B-' OR grade = 'C+' OR grade = 'C' OR grade = 'C-' OR grade = 'D+' OR grade = 'D' OR grade = 'D-' OR grade = 'F' OR grade = 'P/F'),
CHECK(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'),
PRIMARY KEY(studentID, courseID, year, term, sectionNumber),
FOREIGN KEY(studentID) REFERENCES Students(studentID),
FOREIGN KEY(courseID, year, term) REFERENCES Sections(courseID, year, term),
FOREIGN KEY(sectionNumber) REFERENCES Sections(sectionNumber)
);
-- HOLDS THE DIFFERENT DEGREES THAT CAN BE ATTAINED AT THE COLLEGE/UNIVERSITY --
CREATE TABLE Degrees (
degreeID SERIAL UNIQUE NOT NULL,
degreeName TEXT NOT NULL,
degreeType TEXT NOT NULL,
degDepartment VARCHAR(4) NOT NULL,
CHECK(degreeType = 'Major' OR degreeType = 'Minor' OR degreeType = 'Masters'),
PRIMARY KEY(degreeID)
);
-- HOLDS THE CLASSES THAT WILL MAKE UP A DEGREE --
CREATE TABLE DegreeReq (
degreeID INT REFERENCES Degrees(degreeID) UNIQUE NOT NULL,
courseID INT REFERENCES Courses(courseID) NOT NULL,
PRIMARY KEY(degreeID, courseID)
);
-- HOLDS THE INSTANCE OF A DEGREE FOR A CERTAIN STUDENT --
-- FOR EXAMPLE: A STUDENT CAN HAVE A MAJOR AND A MINOR --
-- SO HE/SHE CAN STORE THEM SEPARATELY --
CREATE TABLE DegreeInstance (
degreeID INT REFERENCES Degrees(degreeID) UNIQUE NOT NULL,
studentID INT REFERENCES Students(studentID) UNIQUE NOT NULL,
startDate DATE NOT NULL,
endDate DATE NOT NULL,
creditsRequired INT NOT NULL,
PRIMARY KEY(degreeID, studentID)
);
-- HOLDS ALL THE RATE MY PROFESSOR STATS --
CREATE TABLE Rating (
professorID 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,
PRIMARY KEY(professorID, rmpID),
FOREIGN KEY(professorID) REFERENCES Professors(professorID)
);
ERROR: there is no unique constraint matching given keys for referenced table "sections"
********** Error **********
ERROR: there is no unique constraint matching given keys for referenced table "sections"
SQL state: 42830
您已声明此关系:
FOREIGN KEY(sectionNumber) REFERENCES Sections(sectionNumber)
sectionnumber
未声明为唯一。需要修复数据结构或使用主键
我正在为 类 的注册创建一个数据库,但我在使用 "Enrollment" table 时遇到了问题。我需要将所有主键从部分传递到注册中,但我还想传递一个附加键 ("sectionNumber")。但是,我不想让 "sectionNumber" 成为 "Sections" 的主键的一部分,因为我不想将 sectionNumber 传递到每个 table 我有外键的地方来自 "Sections." 有人对如何解决这个问题有任何建议吗?我一直收到以下错误。
-- HOLDS A SPECIFIC COURSE WITHOUT THE INSTANCES OF THE CLASS -- CREATE TABLE Courses ( courseID SERIAL UNIQUE NOT NULL, department TEXT NOT NULL, courseNumber VARCHAR(10) NOT NULL, courseName TEXT UNIQUE NOT NULL, credits INT NOT NULL, PRIMARY KEY(courseID) ); -- PEOPLE SUPERTYPE -- CREATE TABLE People ( pid SERIAL UNIQUE NOT NULL, fname TEXT NOT NULL, lname TEXT NOT NULL, PRIMARY KEY(pid) ); -- HOLDS THE DIFFERENT PROFESSORS TEACHING AT THE SCHOOL -- -- SUBTYPE OF PEOPLE -- CREATE TABLE Professors ( professorID INT UNIQUE NOT NULL, status TEXT NOT NULL, CHECK(status = 'Full-Time' OR status = 'Part-time'), PRIMARY KEY(professorID), FOREIGN KEY(professorID) REFERENCES People(pid) ); -- HOLDS THE SPECIFIC INSTANCES OF THE CLASS DEPENDING ON THE YEAR AND TERM -- CREATE TABLE Sections ( courseID INT NOT NULL, year INT NOT NULL, term TEXT NOT NULL, sectionNumber INT NOT NULL, startDate DATE NOT NULL, endDate DATE NOT NULL, crn INT NOT NULL, CHECK(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'), PRIMARY KEY(courseID, year, term), FOREIGN KEY(courseID) REFERENCES Courses(courseID) ); -- HOLDS THE EVENT OF THE CLASS -- -- A CLASS MAY HAVE DIFFERENT DAYS ON WHICH -- -- THEY MEET ON, SO THIS ALLOWS A CERTAIN -- -- SECTION TO HAVE SEVERAL DAYS WITHOUT CONFLICT -- CREATE TABLE ClassEvent ( professorID INT UNIQUE NOT NULL, courseID INT NOT NULL, year INT NOT NULL, term TEXT NOT NULL, day TEXT, startTime TIME, 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 IS NULL), CHECK(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'), PRIMARY KEY(professorID, courseID, year, term, day, startTime, endTime), FOREIGN KEY(professorID) REFERENCES Professors(professorID), FOREIGN KEY(courseID, year, term) REFERENCES Sections(courseID, year, term) ); -- GENERATES THE PREREQUESITES -- CREATE TABLE Prerequisites ( courseID INT NOT NULL, year INT NOT NULL, term TEXT NOT NULL, prereqID INT NOT NULL, CHECK(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'), PRIMARY KEY(courseID, year, term, prereqID), FOREIGN KEY(courseID, year, term) REFERENCES Sections(courseID, year, term), FOREIGN KEY(prereqID) REFERENCES Courses(courseID) ); -- HOLDS THE STUDENTS THAT WILL BE TAKING THE CLASSES -- -- SUBTYPE OF PEOPLE -- CREATE TABLE Students ( studentID INT REFERENCES People(pid) UNIQUE NOT NULL, studentName TEXT NOT NULL, gradYear DATE UNIQUE NOT NULL, PRIMARY KEY(studentID) ); -- HOLDS A CLASS RECORD FOR STUDENTS (AND POSSIBLY PROFESSORS) -- CREATE TABLE Enrollment ( studentID INT UNIQUE NOT NULL, courseID INT NOT NULL, year INT NOT NULL, term TEXT NOT NULL, sectionNumber INT NOT NULL, grade TEXT, CHECK(grade = 'A' OR grade = 'A-' OR grade = 'B+' OR grade = 'B' OR grade = 'B-' OR grade = 'C+' OR grade = 'C' OR grade = 'C-' OR grade = 'D+' OR grade = 'D' OR grade = 'D-' OR grade = 'F' OR grade = 'P/F'), CHECK(term = 'Fall' OR term = 'Winter' OR term = 'Spring' OR term = 'Summer'), PRIMARY KEY(studentID, courseID, year, term, sectionNumber), FOREIGN KEY(studentID) REFERENCES Students(studentID), FOREIGN KEY(courseID, year, term) REFERENCES Sections(courseID, year, term), FOREIGN KEY(sectionNumber) REFERENCES Sections(sectionNumber) ); -- HOLDS THE DIFFERENT DEGREES THAT CAN BE ATTAINED AT THE COLLEGE/UNIVERSITY -- CREATE TABLE Degrees ( degreeID SERIAL UNIQUE NOT NULL, degreeName TEXT NOT NULL, degreeType TEXT NOT NULL, degDepartment VARCHAR(4) NOT NULL, CHECK(degreeType = 'Major' OR degreeType = 'Minor' OR degreeType = 'Masters'), PRIMARY KEY(degreeID) ); -- HOLDS THE CLASSES THAT WILL MAKE UP A DEGREE -- CREATE TABLE DegreeReq ( degreeID INT REFERENCES Degrees(degreeID) UNIQUE NOT NULL, courseID INT REFERENCES Courses(courseID) NOT NULL, PRIMARY KEY(degreeID, courseID) ); -- HOLDS THE INSTANCE OF A DEGREE FOR A CERTAIN STUDENT -- -- FOR EXAMPLE: A STUDENT CAN HAVE A MAJOR AND A MINOR -- -- SO HE/SHE CAN STORE THEM SEPARATELY -- CREATE TABLE DegreeInstance ( degreeID INT REFERENCES Degrees(degreeID) UNIQUE NOT NULL, studentID INT REFERENCES Students(studentID) UNIQUE NOT NULL, startDate DATE NOT NULL, endDate DATE NOT NULL, creditsRequired INT NOT NULL, PRIMARY KEY(degreeID, studentID) ); -- HOLDS ALL THE RATE MY PROFESSOR STATS -- CREATE TABLE Rating ( professorID 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, PRIMARY KEY(professorID, rmpID), FOREIGN KEY(professorID) REFERENCES Professors(professorID) );
ERROR: there is no unique constraint matching given keys for referenced table "sections" ********** Error ********** ERROR: there is no unique constraint matching given keys for referenced table "sections" SQL state: 42830
您已声明此关系:
FOREIGN KEY(sectionNumber) REFERENCES Sections(sectionNumber)
sectionnumber
未声明为唯一。需要修复数据结构或使用主键