我正在开展一个涉及实施学校数据库简化版的项目。下面列出了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的多个条目。如何解决此错误?
答案 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/