mysql - 如何使复合键唯一?

标签 mysql sql database-design uml composite-key

我正在为一所学校的学生建立一个数据库。这是我目前所拥有的: enter image description here

如果您不喜欢阅读,请跳转到“简而言之”部分

问题是我对这个设计不满意。我希望 gradesubgradeid_class 的组合是唯一的,并用作学生表的主键。 我可以删除 student_id 并从 3 中创建一个复合键,但我也不想这样做。也许我应该制作另一张表让我们说 combination_id 其中 gradesubgradeid_class 是外键并且有一个用作表 ID 的额外列 comb_id。所有列都将是主键。但问题是,由于那个额外的列 (comb_id),这 3 列仍然可以重复。例如,我可以有相同的 gradesubgradeclass_id 但不同的 comb_id 这将使该行有效,因为表的 4 列的组合键 (combination_id)。

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

如果我不够清楚,请在下面的评论中提问,在此先感谢您。

PS 我很抱歉标题没有描述性,但我不擅长命名

编辑 1: 更清楚一点: grade 可以是 1 到 12 subgrade 可以是 a 到 j id_class 可以是 1 到 30,它是你在类里面的编号

所以一个学生可以来自 7b 类(class),他在类(class)的人数 - 5

最佳答案

不要混淆唯一键主键的概念。您可以很好地添加 unique key跨越三列 gradessubgradeclass_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/

相关文章:

java - 如何根据先前的下拉值过滤后选择html下拉值

sql - "read commited"和 "repeatable read"的区别

php - Android MySQL-PHP 数据库字符串不通过问题

asp.net-mvc - 数据库中未注册的用户

Mysql时间戳差异结果

php - mysql_real_escape_string 的安全替代品? (PHP)

sql-server - 设计这个数据库场景的最佳方法是什么?

sql-server - 为多个表中的每一行创建全局 ID 以用于通知

php - 通过 PHP Mysql 搜索

mysql - 当 mysql 查询中缺少数据时,我想显示关系数据