2016-04-20 119 views
0

我正在为类的注册制作一个数据库,并且我在“注册”表中遇到了问题。我需要将部分的所有主键传递给注册,但我也想传递一个额外的键(“sectionNumber”)。但是,我不想让“Section”的主键的“sectionNumber”部分,因为我不希望将sectionNumber传入每个我有一个外键的表中,这个表来自“Sections”。任何人都有如何解决这个问题的建议?我不断收到下面的错误。PostgreSQL错误:没有唯一的约束匹配给定表的键给定

 
-- 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 

回答

0

你有这样的关系声明:

FOREIGN KEY(sectionNumber) REFERENCES Sections(sectionNumber) 

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

+0

谢谢!将尝试实现另一个表,所以我可以将sectionNumber存储为主键。 –

+0

@ M.Barbieri。 。 。如果它是唯一的,那么您可以在表格中将其声明为现在唯一。 –