2016-12-30 42 views
0

我有以下表assignment_code必须是唯一的,但我不希望它

CREATE TABLE assignment (
    assignment_code VARCHAR(10), 
    course_code VARCHAR(10), 
    PRIMARY KEY(course_code, assignment_code), 
    FOREIGN KEY(course_code) REFERENCES course(course_code)); 

但是当我尝试去创造的PostgreSQL告诉我assignment_code必须是唯一的。然而,我的任务是让assignment_code在每个课程中独一无二,而不是完全独特,我该怎么做?

下面的代码创建enitre数据库(无数据)

CREATE TABLE students (
    student_id BIGINT PRIMARY KEY, 
    first_name VARCHAR(15), 
    surname VARCHAR(35), 
    enrollment_year INT, 
    bsn BIGINT, 
    class VARCHAR(5), 
    Graduated BOOLEAN); 
CREATE TABLE teachers (
    bsn BIGINT PRIMARY KEY, 
    first_name VARCHAR(15), 
    surname VARCHAR(35), 
    salary REAL, 
    scale INT, 
    CONSTRAINT salary CHECK(salary < (25 * scale) AND salary > (20 *  scale))); 
CREATE TABLE course (
    course_code VARCHAR(10) PRIMARY KEY, 
    course_name VARCHAR(20), 
    course_follower VARCHAR(5), 
    study_points INT, 
    Amount_of_assignments INT); 
CREATE TABLE teaches (
    bsn BIGINT, 
    class VARCHAR(5), 
    course_code VARCHAR(10), 
    PRIMARY KEY(bsn, class, course_code), 
    FOREIGN KEY(bsn) REFERENCES teachers(bsn), 
    FOREIGN KEY(course_code) REFERENCES course(course_code)); 
CREATE TABLE study_program (
    course_name VARCHAR(20), 
    course_code VARCHAR(10) PRIMARY KEY, 
    level VARCHAR(15), 
    duration VARCHAR(10), 
    FOREIGN KEY(course_code) REFERENCES course(course_code)); 
CREATE TABLE assignment (
    assignment_code VARCHAR(10), 
    course_code VARCHAR(10), 
    PRIMARY KEY(course_code, assignment_code), 
    FOREIGN KEY(course_code) REFERENCES course(course_code)); 
CREATE TABLE records (
    student_id BIGINT, 
    course_code VARCHAR(20), 
    school VARCHAR(50), 
    PRIMARY KEY(student_id, course_code), 
    FOREIGN KEY(student_id) REFERENCES students(student_id), 
    FOREIGN KEY(course_code) REFERENCES study_program(course_code)); 
CREATE TABLE make (
    student_id BIGINT, 
    assignment_code VARCHAR(20), 
    completed BOOLEAN, 
    PRIMARY KEY(student_id, assignment_code), 
    FOREIGN KEY(student_id) REFERENCES students(student_id), 
    FOREIGN KEY(assignment_code) REFERENCES assignment(assignment_code)); 
CREATE TABLE prerequisit (
    assignment_code VARCHAR(20), 
    prerequisit_code VARCHAR(20), 
    course_code VARCHAR(20), 
    PRIMARY KEY(assignment_code, course_code), 
    FOREIGN KEY(assignment_code) REFERENCES assignment(assignment_code), 
    FOREIGN KEY(course_code) REFERENCES course(course_code), 
    FOREIGN KEY(prerequisit_code) REFERENCES assignment(assignment_code)); 
CREATE TABLE records_2 (
    assignment_code VARCHAR(20), 
    course_code VARCHAR(20), 
    bsn BIGINT, 
    mandatory BOOLEAN, 
    year INT, 
    week INT, 
    PRIMARY KEY(assignment_code, course_code, bsn), 
    FOREIGN KEY(assignment_code) REFERENCES assignment(assignment_code), 
    FOREIGN KEY(course_code) REFERENCES course(course_code), 
    FOREIGN KEY(bsn) REFERENCES teachers(bsn));  
CREATE TABLE designes (
    course_code VARCHAR(15), 
    bsn BIGINT, 
    PRIMARY KEY(course_code), 
    FOREIGN KEY(course_code) REFERENCES course(course_code), 
    FOREIGN KEY(bsn) REFERENCES teachers(bsn));  
CREATE TABLE reviews (
    bsn BIGINT, 
    course_code VARCHAR(15), 
    PRIMARY KEY(bsn, course_code), 
    FOREIGN KEY(bsn) REFERENCES teachers(bsn), 
    FOREIGN KEY(course_code) REFERENCES course(course_code)); 
+0

你使用的是什么版本的postgresql? – zola

+0

PostgreSQL版本9.6 –

+0

你的'create table'应该没问题。编辑你的问题,并包括产生错误的代码。 –

回答

3

代码中的深潜伏是这样的:

CREATE TABLE records_2 
    . . . 
    FOREIGN KEY(assignment_code) REFERENCES assignment(assignment_code), 

的外键引用必须是唯一或主键。如果你有一个复合主键,那么你需要使用所有的键。因此,此参考文献缺少course_code

我非常信任合成主键 - 即提供此信息的串行整数列。我建议你在你的表格中使用它们和用于外键引用。

+0

这实在是很棒的建议,请牢记它! –

相关问题