什么是外键表,什么是主键表?

来源:互联网 发布:js中getcell函数 编辑:程序博客网 时间:2024/05/02 17:17
表1属性有:typeid(主键),type
表2属性有:goodid(主键),typeid(外键,引用表1中的typeid)

以上哪一个是外键表,哪一个是主键表


表1是主键表、
表1的主键字段在表2中做外键、而表1自己却没有外键
表2是外键表
有一个依赖表1typeid的字段、作为外键、取值必须是其依赖主键表表1中主键字段有的值
同一个表的主键可以是外键吗,注意,我说的是同一个表?
比如表A(a_ID)表B(b_ID),设置表A的a_ID作为主键,同时设置为外键与表B(b_ID)关联。
当然可以
------------------------------------------------------------------------------------------------------

这里涉及几个重要的概念,下面先给出这些概念的定义:

主键:唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性,主键只能有一个。

   外键:表的外键是另一表的主键, 外键可以有重复的可以是空值,用来和其他表建立联系,一个表可以有多个外键。

   

一个关系表事实上是具有共同属性的一类实体的集合。按照集合的定义,集合中元素不能重复。同样,关系表中也不应该有重复记录。例如在学生表中,存有两条一样的学生记录是不必要的,也是不合适的。

在现实世界中,除了事物本身的信息外,事物之间还存在着很多联系,这种联系反映到数据库中就体现为表之间的联系。例如在图1中,学生表存储学生信息,系表存储系的信息。但学生表和系表之间是有联系的:每个学生都属于一个系,而每个系都可以包含多名学生,所以学生表和系表就存在着“属于”的联系。

(图1)

在关系数据库中,如何存储这种联系的信息呢?就要借助“外键”实现。如果一个表中的某一列是另外一个表的中的主键,那么称这列为外键。例如图1学生表中“系号”就是外键,因为系号是系表的主键(建立主外键关系的前提是两张表中有相同的字段和属性。在学生表中设计了“系号”一列,就是为了存储学生和系之间的联系信息。

外键就是连接两个表的纽带。通过外键和主键的等值连接,如图1,就可以将不同表里的相关纪录连接在一起,从而实现了数据库中相关数据的查找。利用外键,可以查询每个学生所在系的信息,也可以查询在制定的系所包含的学生信息。

当两个表通过“外键-主键”建立了联系之后,就要保持两表数据的一致性。例如在插入学生记录的同时,外键的值(系号)必须是系表中主键的有效值(必须有这个系),或者是空值(学生的系暂未确定);又如,在删除系表记录时,如果在学生表里还有该系学生的记录(该系还有学生在就读),那么系记录就不能删除。

下面再分析一个员工信息管理系统的例子。该数据库中建有员工基本信息表(person)、部门编码表(deparment)和学历编码表(education),如图2所示:

(图2)

部门编码表保存了部门编号和部门名称,部门编号(DepID)是主键,每个部门的编号在表中具有唯一性,这样就能保证每行都可以用主键来标识。

学历编码表保存了学历编号和学历名称,学历编号(EduID)是主键。

员工基本信息表存储员工的基本信息,需要包括工作证号、姓名、部门编号、职务、工资、学历编号等字段,工作证号(ID)是该表的主键。在该表中,Department列是一个外键,匹配部门编码表中的DepID主键;Education列也是一个外键,匹配学历编码表中的EduID主键。利用外键和主键的连接,就可以查询出某人,如张三的部门是经理室,他的学历室硕士。

利用“外键-主键”的连接方式能更好夺得简化数据库设计过程,减少数据冗余,提高数据库效率。


0 0