如何使 table 独一无二,'there is no unique constraint matching the referenced table'?
How can I make table unique, 'there is no unique constraint matching the referenced table'?
我正在尝试为注册系统创建一个数据库。但是,我 运行 遇到的问题是我没有某些 table 的唯一密钥。我不能制作人工密钥,因为那样会破坏数据库的完整性(在弱实体中使用人工密钥不是最佳做法)。如何修复 "Sections" table 中的此错误以使 "ClassEvents" 中的行唯一?
-- 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 NOT NULL,
credits INT NOT NULL,
PRIMARY KEY(department, 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 (
department TEXT NOT NULL,
courseID INT UNIQUE NOT NULL,
year INT NOT NULL,
term TEXT NOT NULL,
sectionNumber INT NOT NULL,
startDate DATE NOT NULL,
endDate DATE NOT NULL,
PRIMARY KEY(department, courseID, sectionNumber, year, term),
FOREIGN KEY(department, courseID) REFERENCES Courses(department, 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 UNIQUE NOT NULL,
sectionNumber 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),
PRIMARY KEY(professorID, courseID, sectionNumber, year, term, day, startTime, endTime),
FOREIGN KEY(professorID) REFERENCES Professors(professorID),
FOREIGN KEY(courseID, sectionNumber, year, term) REFERENCES Sections(courseID, sectionNumber, year, term)
);
-- 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 REFERENCES Students(studentID) UNIQUE NOT NULL,
crn INT REFERENCES Sections(crn) NOT NULL,
grade TEXT NOT NULL,
PRIMARY KEY(studentID, crn)
);
-- 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) UNIQUE 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 Stats (
professorID INT REFERENCES Professors(professorID) UNIQUE NOT NULL,
dateSubmitted TIMESTAMP UNIQUE NOT NULL,
rating FLOAT NOT NULL,
helpfulness FLOAT NOT NULL,
clarity FLOAT NOT NULL,
easiness FLOAT NOT NULL,
PRIMARY KEY(professorID, dateSubmitted)
);
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
您在 Sections
table 中将 (department, courseID, sectionNumber, year, term)
定义为主键,而在 table ClassEvents
中您引用了集合 (courseID, sectionNumber, year, term)
而没有字段 department
。您必须引用整个密钥而不是其中的一部分。所以加这个字段解决问题
我正在尝试为注册系统创建一个数据库。但是,我 运行 遇到的问题是我没有某些 table 的唯一密钥。我不能制作人工密钥,因为那样会破坏数据库的完整性(在弱实体中使用人工密钥不是最佳做法)。如何修复 "Sections" table 中的此错误以使 "ClassEvents" 中的行唯一?
-- 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 NOT NULL, credits INT NOT NULL, PRIMARY KEY(department, 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 ( department TEXT NOT NULL, courseID INT UNIQUE NOT NULL, year INT NOT NULL, term TEXT NOT NULL, sectionNumber INT NOT NULL, startDate DATE NOT NULL, endDate DATE NOT NULL, PRIMARY KEY(department, courseID, sectionNumber, year, term), FOREIGN KEY(department, courseID) REFERENCES Courses(department, 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 UNIQUE NOT NULL, sectionNumber 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), PRIMARY KEY(professorID, courseID, sectionNumber, year, term, day, startTime, endTime), FOREIGN KEY(professorID) REFERENCES Professors(professorID), FOREIGN KEY(courseID, sectionNumber, year, term) REFERENCES Sections(courseID, sectionNumber, year, term) ); -- 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 REFERENCES Students(studentID) UNIQUE NOT NULL, crn INT REFERENCES Sections(crn) NOT NULL, grade TEXT NOT NULL, PRIMARY KEY(studentID, crn) ); -- 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) UNIQUE 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 Stats ( professorID INT REFERENCES Professors(professorID) UNIQUE NOT NULL, dateSubmitted TIMESTAMP UNIQUE NOT NULL, rating FLOAT NOT NULL, helpfulness FLOAT NOT NULL, clarity FLOAT NOT NULL, easiness FLOAT NOT NULL, PRIMARY KEY(professorID, dateSubmitted) );
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
您在 Sections
table 中将 (department, courseID, sectionNumber, year, term)
定义为主键,而在 table ClassEvents
中您引用了集合 (courseID, sectionNumber, year, term)
而没有字段 department
。您必须引用整个密钥而不是其中的一部分。所以加这个字段解决问题