如何使表格独一无二,'没有与引用表匹配的唯一约束'?

时间:2016-04-16 18:42:33

标签: sql database postgresql referential-integrity

我正在尝试为注册系统建立一个数据库。但是我遇到的问题是我没有某些表的唯一键。我不能制作一个人工密钥,因为这会抛出数据库的完整性(在弱实体中使用人工密钥不是最佳实践)。如何修复此错误,在"部分" 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

1 个答案:

答案 0 :(得分:1)

您将(department, courseID, sectionNumber, year, term)定义为Sections表中的主键,而在表ClassEvents中您引用了集合(courseID, sectionNumber, year, term)而没有字段department。你必须引用整个密钥而不是它的一部分。所以添加此字段以解决问题