主键(PrimaryKey)与外键(ForeignKey)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了主键(PrimaryKey)与外键(ForeignKey)相关的知识,希望对你有一定的参考价值。
主键(Primary)
主键就是数据行的唯一标识。不会重复的列才能当主键。
工号 | 姓名 | 部门 | 入职时间 |
001 | 凤姐 | 员工培训部 | 2010-07-05 |
002 | 兽兽 | 公关部 | 2010-08-02 |
003 | 憨憨 | 开发部 | 2009-03-05 |
为了能唯一标识一行数据,我们给每位员工设置了一个编号(工号),让这个工号来作为这条数据的主键
在上表中如果用姓名来作为主键,当然是不行的,因为姓名有可能重复
一个表可以没有主键,但是会非常难以处理,因此没有特殊理由的表都要设定主键。
那么,一般情况下,我们应该选用什么来做主键呢?
主键一般有两种选用策略:业务主键和逻辑主键。
业务主键是使用有业务意义的字段来做主键,比
如 身份证号、银行账号等;
逻辑主键是使用没有任务意义的字段做主键(这是完全给程序看的,业务人员不会看数据)。
因为很难保证业务主键不会重复、不会变化,比如 身份证号重复,另外如果上述表中,凤姐离职了,工号为001的人变成了张三,这样都会导致错误。
因此推荐用逻辑主键。
外键(ForeignKey)
商品名 | 价格 | 生产厂家 | 厂家地址 | 厂家电话 |
大大香瓜子 | 5.00 | 大大食品厂 | 恰恰大街300号 | 010-123456 |
大大开心果 | 15.00 | 大大食品厂 | 恰恰大街300号 | 010-123456 |
苦咖啡 | 2 | 伊利食品厂 | 内蒙古伊利路1号 | 400400400 |
随变 | 3 | 伊利食品厂 | 内蒙古伊利路1号 | 400400400 |
冰工厂 | 1 | 伊利食品厂 | 内蒙古伊利路1号 | 400400400 |
上表中记录的是几种商品的基本信息以及生产厂家的信息,这样来记录信息,有一个重大的缺点,即数据重复,如果这个超市有很多很多的同种商品,那么就需要将相同的厂家信息重复很多遍,而且,一旦,厂家地址变了,是不是还需要把所有的厂家地址都改了,很显然这样太痛苦了,如果是要存在数据库里面,这都是要占空间的。
所以我们在设计数据库的时候,注意要把这一张表分成两张表:一张专门来存储厂家信息,如表
编号 | 名称 | 地址 | 电话 |
001 | 大大食品厂 | 恰恰大街300号 | 010-123456 |
002 | 伊利食品厂 | 内蒙古伊利路1号 | 400400400 |
另一张来存储商品的信息,如表
商品名 | 价格 | 厂家编号 |
大大香瓜子 | 5.00 | 001 |
大大开心果 | 15.00 | 001 |
苦咖啡 | 2 | 002 |
随变 | 3 | 002 |
冰工厂 | 1 | 002 |
怎么样,这样的话,是不是更清晰了呢。两个表通过厂家编号互相关联,“厂家编号”在厂家信息表里是作为主键存在的,商品信息表通过”厂家编号“与厂家信息表取得关联,这样的话从商品信息表中的”厂家编号“字段就可以很容易地查找到商品对应的商家信息。如此一来,这些数据在数据库里占用的空间就小了很多,而且,在厂家信息产生变更之后,我们只要更新厂家信息表中对应的字段就可以了,不用再一条一条的为每个商品区改商家的信息了。
上述表中第二个表的”厂家编号“字段是指向第一个表的主键的外键
以上是关于主键(PrimaryKey)与外键(ForeignKey)的主要内容,如果未能解决你的问题,请参考以下文章
超键(super key)、候选键(candidate key)和主键(primary key) 外键(foreign key)的区别