2011-09-06 77 views
5

我正在读一本书由保罗·杜波依斯,并在书中,他说叫“MySQL开发的图书馆”:任何人都可以向我解释什么主键实际上做什么?

CREATE TABLE score 
(
student_id INT UNSIGNED NOT NULL, 
event_id INT UNSIGNED NOT NULL, 
score INT NOT NULL, 
PRIMARY KEY (event_id, student_id), 
INDEX (student_id), 
FOREIGN KEY (event_id) REFERENCES grade_event (event_id), 
FOREIGN KEY (student_id) REFERENCES student (student_id) 
) ENGINE = InnoDB; 

我们做了两列的组合主键。 这确保了我们在给定的测验或测验中不会有重复的分数 。请注意,这是 event_id 和唯一的student_id的组合。在分数表中, 值本身都不是唯一的 。将有多个得分排的每个事项标识 值 (每名学生一个),以及多行由学生

拍摄的每张student_id数据值 (每个 测验和测试)是什么尚不清楚我是将两列组合成一个主键......意思是说,我很难想象在引擎盖下究竟会发生什么......它以一组数字[95,210]为例,并用它作为一个“钥匙”......把主钥匙当作散列钥匙是否合适?

以前我一直认为主键只不过是表格的唯一ID ..但现在在这种情况下,我发现自己究竟是在做什么主键。任何人都可以给我低SQL键?

回答

3

“主键”是关系数据库中的一个基本概念。他们是(意为)识别表中的行的方法。

主键非常明确不是只是一个“唯一的ID”。

是的,“主键”可能(并且通常会)不只包含一列。

这里是 “多对一对多” 的关系表一个很好的链接:

http://www.tekstenuitleg.net/en/articles/software/database-design-tutorial/many-to-many.html

PS: 为了回答您的具体问题:

  1. 你举的例子一个将几乎当然至少还有两张表格:一张是“学生”,另一张是“事件”。

  2. 在此示例中,“分数”表格表示特定学生在特定事件中获得的分数。 “复合主键”由“student id”(“student”表中的“外键”)和“event id”(事件表中的外键)组成。

  3. 如果你想要的只是分数,那么“分数”表就足够了。

  4. 如果你想与他的分数一起打印出来的学生的姓名,但是,您将需要“加入”学生表和成绩表(做一个“内部连接”的“student_id数据”)

  5. 同样,如果您想打印事件名称或位置以及分数,您可能需要在“event_id”上进行分数和事件的内部连接。

'希望有帮助!

2

主键中的值允许您始终唯一标识表中的一行数据。

如果您有多个候选键,则对应于每个候选键的值始终唯一标识表中的单个行。一个候选关键字(可以)被选择为“主关键字”,但是选择哪个候选关键词在很大程度上是任意的。这些标准超出了数据本身关系模型的范围(通常,您选择最短密钥或最广泛使用的密钥)。

因此,主键是表的元组级或行级寻址机制。

2

关键点是数据完整性。该键可防止任何用户输入重复行 - 具有相同键值属性集的行。这确保了每一行都可以被唯一标识,从而避免冗余,异常和可能因复制信息而导致的结果不一致。按键实施业务规则,定义表格的含义并保护数据的完整性。

在您的特定示例中,如果可以为每个事件和学生输入多行,则每个事件的单个学生可以有多个分数。关键在于规定学生每个活动只能有一个分数。

相关问题