如何使一个复合键是唯一的?(How to make a composite key to be un

2019-07-30 17:49发布

我让学生在一个school.Here数据库是我到目前为止有:

如果你不喜欢读书跳转到“简单”的一部分

问题是,我不是很满意这个设计。 我想要的组合gradesubgradeid_class是唯一的,并作为学生表的主键。 我可以删除student_id ,并从3复合键,但我不想,要么。 也许我应该让另一个表可以说combination_id地方gradesubgradeid_class外键并有一个额外的列comb_id ,可作为表ID。 而所有列将是主键。 但问题是,这3列仍然可以重复,因为这额外的列(的comb_id )。 例如,我可以有相同的gradesubgradeclass_id ,但不同comb_id这将使因为表(的4列的组合键的行有效combination_id )。

总之我想students_id保持表的唯一主键,但成为一个外键到另一个表这是莫名其妙的独特组合gradessubgradeclass_id

如果我是不够明确要求在下面的意见,并感谢你提前。

PS 我的indescriptive标题抱歉,但我感觉不好的命名

编辑1:为了更清楚: grade为1〜12 subgrade可以是到j id_class可以是1至30,这是你在课堂上号

因此,学生可以从图7b类和他的数类 - 5

Answer 1:

不要混用唯一键主键的概念。 可以很好地添加一个唯一的密钥跨越三个gradessubgradeclass_id 。 这样一来,没有两行可能会对这些三列的值相同。 当你写,你不希望有这三个作为一个复合主键,我不知道一个复合唯一补充键是否会更好。 如果没有,你必须在组合键是可以接受的澄清。

要创建一个独特的键,你可以使用下面的SQL 语句 :

ALTER TABLE students ADD UNIQUE gsc (grades, subgrade, class_id);

这个词gsc也只是我从键列的首字母组成的名称; 使用任何你想要的名字,因为它并不重要,除非你想找出一些关键的EXPLAIN输出或相似。



Answer 2:

我不是你为什么想你所描述的完全不明确的,但我想看看下面的方法模型...

你有学生
- 他们是独立的实体,而不是其他实体的复合
- 他们有自己的属性; 姓名,出生日期等

你上课
- 这是学生群体
- 每个accademic同期的“类”中有不同的学生
- 他们也有自己的属性; 等级,分等级等

你有你的模型额外的属性,我将无法正常使用
- 如果一个类具有20个学生,它们中的每是确定与二次ID从1至20个


这将使下面的维度表

Student                  Class                     Grade              SubGrade
-----------------------  ------------------------  -----------------  -----------------
id          INT PK       id           INT PK       id    INT PK       id    INT PK
first_name  VARCHAR(45)  name         VARCHAR(45)  name  VARCHAR(45)  name  VARCHAR(45)
last_name   VARCHAR(45)  grade_id     INT FK       desc  VARCHAR(45)  desc  VARCHAR(45)
etc, etc                 subgrade_id  INT FK       etc, etc           etc, etc

Class表将有一个独特的约束(grade_id, subgrade_id)因此只有一个类可能永远不会7b

然后,你需要涉及学生用事实表他们班...

Class_Membership
-----------------------
id               INT PK
student_id       INT FK
class_id         INT FK
academic_year    INT

如果一个学生应该永远只能是在一个类中的任何学年,你会放一个独特的约束(student_id, academic_year)

或者,你可以在该学年Class表。 这意味着,你将不得不重复每年同一类,但在某些年份类7g可能不存在(因为有学生小于今年为例)。

同样,你可以有谁动学生7b7c年中。 在这种情况下Class_Membership表可以有一个start_date字段和可能的end_date字段。


那然而,没有直接创建id_class(1-20与20个学生一个班)。 个人而言,我不会有这样的领域, id从外地Class_Membership表格可大部分相同的功能,并可能附加功能。 它必要的,但是,你可以简单地把它添加到Class_Membership表...

Class_Membership
-----------------------
id               INT PK
student_id       INT FK
class_id         INT FK
academic_year    INT
class_member_id  INT

然后,你还可以有一个独特的约束(academic_year, class_id, class_member_id)


有相当多的灵活性,在这里,根据您的具体现实世界的模型和你的特殊需要。 但希望这个例子是一个良好的开端为您服务; 维表列出的实体,和一个事实表(或表)有关这些实体一起和/或进一步描述的实体。



Answer 3:

alter table <TableName> add constraint <ConstraintName> unique(<col1>, <col2>)

Modified the answer due to syntax mistakes. Mentioned above is correct.


文章来源: How to make a composite key to be unique?