我正在为一所学校的学生建立一个数据库。这是我目前所拥有的:
如果您不喜欢阅读,请跳转到“简而言之”部分
问题是我对这个设计不满意。我希望 grade
、subgrade
和 id_class
的组合是唯一的,并用作学生表的主键。
我可以删除 student_id
并从 3 中创建一个复合键,但我也不想这样做。也许我应该制作另一张表让我们说 combination_id
其中 grade
、subgrade
和 id_class
是外键并且有一个用作表 ID 的额外列 comb_id
。所有列都将是主键。但问题是,由于那个额外的列 (comb_id
),这 3 列仍然可以重复。例如,我可以有相同的 grade
、subgrade
和 class_id
但不同的 comb_id
这将使该行有效,因为表的 4 列的组合键 (combination_id
)。
简而言之,我希望 students_id
保留该表的唯一主键,但要成为另一个表的外键,该表是 grades
的某种独特组合,subgrade
和 class_id
。
如果我不够清楚,请在下面的评论中提问,在此先感谢您。
PS 我很抱歉标题没有描述性,但我不擅长命名
编辑 1:
更清楚一点:
grade
可以是 1 到 12
subgrade
可以是 a 到 j
id_class
可以是 1 到 30,它是你在类里面的编号
所以一个学生可以来自 7b 类(class),他在类(class)的人数 - 5
最佳答案
不要混淆唯一键和主键的概念。您可以很好地添加 unique key跨越三列 grades
、subgrade
和 class_id
。这样,就没有两行 could have这三列的值相同。当您写道您不想将这三个作为复合主键时,我不确定复合唯一补充键是否会更好。否则,您必须说明何时可以接受复合键。
要创建唯一键,您可以使用以下 SQL statement :
ALTER TABLE students ADD UNIQUE gsc (grades, subgrade, class_id);
gsc
这个词只是我根据关键列的首字母组成的一个名字;使用你想要的任何名称,因为它几乎不重要,除非你想在某些 EXPLAIN
输出或类似输出中识别 key 。
关于mysql - 如何使复合键唯一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11773562/