如何使复合键具有独特性?

Bos*_*sak 8 mysql sql database-design uml composite-key

我正在一所学校建立一个学生数据库.这是我到目前为止所拥有的: 在此输入图像描述

如果你不喜欢阅读跳转到"简短"部分

问题是我对这种设计不满意.我希望组合grade,subgrade并且id_class是唯一的,并作为学生表的主键.我可以student_id从3中删除并制作一个复合键,但我也不想要.也许我应该让另一个表让我们说combination_id在哪里grade,subgrade并且id_class是外键,并且有一个额外的列comb_id作为表的ID.所有列都是主键.但问题是,由于额外的列(comb_id),这3列仍然可以重复.例如,我可以有相同的grade,subgradeclass_id而不同comb_id,这将使因为表的4列的组合键行有效的(combination_id).

简而言之,我希望students_id仍然是表的唯一主键,但要成为另一个表的外键,它是某种独特的组合grades,subgradeclass_id.

如果我不够清楚,请在下面的评论中提出并提前感谢您.

PS 我很抱歉这个名字很难,但是我很难命名

编辑1: 更清楚: grade可以是1到12 subgrade可以是一个到j id_class可以是1到30这是你在班上的数字

因此,一个学生可以从7b班级和他的班级 - 5

MvG*_*MvG 22

不要混合使用唯一键主键的概念.你可以很好地添加一个跨越三列的唯一键grades,subgradeclass_id.这样,这三列中没有两行可以具有相同的值.当你写这篇文章时,你不希望将这三个作为复合主键,我不确定复合唯一补充键是否会更好.如果没有,您将必须澄清何时可以接受复合键.

要创建唯一键,可以使用以下SQL 语句:

ALTER TABLE students ADD UNIQUE gsc (grades, subgrade, class_id);
Run Code Online (Sandbox Code Playgroud)

这个词gsc只是我从关键列的首字母组成的名字; 使用你想要的任何名称,因为它几乎不重要,除非你想在某些EXPLAIN输出或类似的东西中识别键.