SQL - "没有唯一约束匹配给定键"尽管存在主键

时间:2018-04-07 04:21:13

标签: mysql sql database database-design

我正在开展一个涉及实施学校数据库简化版的项目。下面列出了3个相关表:

create table classes(        --A given class
    class_code varchar(10) primary key
);

create table class_offerings(    --A particular instance of a class
    class_code varchar(10),
    class_name varchar(128) not null,
    semester_code integer,
    maximum_capacity integer check (maximum_capacity >= 0),
    teacher_name varchar(50) not null,    --heavily simplified
    primary key (class_code, semester_code),
    foreign key (class_code) references classes(class_code) 
    on delete cascade on update cascade
);

create table prerequisites(
    prereq varchar(10),
    class_code varchar(10),
    semester_code integer,
    primary key (class_code, semester_code),
    foreign key (class_code) references classes(class_code) 
    on delete cascade on update cascade,
    foreign key (semester_code) references class_offerings(semester_code) 
    on delete cascade on update cascade,
    foreign key (prereq) references classes(class_code) 
    on delete cascade on update cascade
);

当我尝试创建"先决条件时,"我给出了消息" ERROR:没有唯一约束匹配给定的引用表class_offerings的键。"虽然 是真的,但我还没有将UNIQUE约束应用于semester_code,它是主键的一部分,据我所知,它强制执行主要内容中所有元素的唯一组合。键。如果我证明是错的,我仍然不想将UNIQUE应用于semester_code,因为如果他们不共享相同的class_code,则应该允许相同semester_code的多个条目。如何解决此错误?

1 个答案:

答案 0 :(得分:0)

外键也可以由几列组成:

foreign key (class_code, semester_code) 
     references class_offerings(semester_code,class_code) 
     on delete cascade on update cascade,
然而,就个人而言,我会避免这样的设计。如果可能的话,我会引入人工ID作为始终提供主键的自动增量列。这样外键总是可以在人工ID列上。

自然键很好,也应该作为数据库的约束,我不会在自然键上建立关系。但是,这是我个人的偏好,并且有自然键也是主键的论据:https://sqlstudies.com/2016/08/29/natural-vs-artificial-primary-keys/