2016-04-16 4 views
0

Я пытаюсь создать базу данных для системы регистрации. Однако я столкнулся с проблемой, что у меня нет уникального ключа для определенных таблиц. Я не могу создать искусственный ключ, потому что это избавит вас от целостности базы данных (лучше не использовать искусственные ключи в слабых сущностях). Как я могу исправить эту ошибку в таблице «Разделы», чтобы сделать строки в «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 
+1

Зачем нужен последовательный столбец в составном первичном ключе? Это не имеет смысла. –

+0

почему это не имеет смысла? Я новичок в базе данных, поэтому я делаю все возможное, но я уверен, что сильным сущностям разрешено иметь искусственные ключи. @GordonLinoff –

+0

@MBarbieri. , , Серийный столбец уникален для каждой строки. Нет причин включать другие столбцы в первичный ключ. –

ответ

1

вы определили (department, courseID, sectionNumber, year, term) в качестве первичного ключа в таблице Sections в таблице ClassEvents вы ссылаетесь коллекциями (courseID, sectionNumber, year, term) без поля department. вы должны ссылаться на весь ключ, а не на его часть. Итак, добавьте это поле, чтобы решить эту проблему.

+0

Спасибо! Работал как магия. –

 Смежные вопросы

  • Нет связанных вопросов^_^