主键(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

怎么样,这样的话,是不是更清晰了呢。两个表通过厂家编号互相关联,“厂家编号”在厂家信息表里是作为主键存在的,商品信息表通过”厂家编号“与厂家信息表取得关联,这样的话从商品信息表中的”厂家编号“字段就可以很容易地查找到商品对应的商家信息。如此一来,这些数据在数据库里占用的空间就小了很多,而且,在厂家信息产生变更之后,我们只要更新厂家信息表中对应的字段就可以了,不用再一条一条的为每个商品区改商家的信息了。

上述表中第二个表的”厂家编号“字段是指向第一个表的主键的外键

时间: 2024-09-28 21:52:20

主键(PrimaryKey)与外键(ForeignKey)的相关文章

MySql数据库在表中添加新字段,设置主键,设置外键,字段移动位置,以及修改数据库后如何进行部署和维护的总结

1,为当前已有的表添加新的字段 alter table student add studentName varchar(20) not null; 2,为当前已有的表中的字段设置为主键自增 alter table student add constraint PK_studentId primaryKey(studentId); 3,为当前已有的表中的字段设置为外键 alter table student add constraint FK_teacherId_studentInfo forei

主键关联、外键关联的区别

主键关联.唯一外键关联 的区别 主键关联是指的一个表的主键和另外一个表的主键关联外键关联是指的一个表的主键和另外一个表的非主键关联 主键关联:    person_t:      person_id      address_id address_t      address_id      address_name 他们通过 address_id 关联是外键关联 person_t:      person_id      persion_name    address_t      perso

主键,子外键查询

主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值.由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列. 主键的作用 主键的主要作用如下: (1)保证实体的完整性: (2)加快数据库的操作速度: (3) 在表中添加新记录时,数据库会自

数据库一对一的两种关联 主键关联和外键关联

关联映射:一对一 一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队. 数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联.图示如下: 一对一外键关联: 一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系 出自:http://hi.baidu.com/websatyr/item/10e3d83766ffb3f42784f481

主键、外键、复合外键的创建

--主键create table emp (id number constraint id_pr primary key ,name1 varchar(8));create table emp9 (id number ,name1 varchar(8) ,constraint aba_pr primary key(id,name1));--外键create table emp1(id number references emp(id),name varchar(8)); --复合外键create

获取引用某个主键的所有外键的表

在数据库中, 碰到删除一张表的时候,有时候会提示主键已经被其他表外键引用.不能删除.如果某个主键被引用的次数多了, 删除起来一个一个找的话,还是浪费时间的. 如果使用的是Oracle的数据库, 可以查询Oracle中的 系统表 USER_CONSTRAINTS SELECT * FROM R_CONSTRAINT_NAME WHERE R_CONSTRAINT_NAME = '被引用的主键约束' 扩展一下, 如果还想知道 具体引用表的哪个字段引用了这个主键. SELECT B.TABLE_NAM

MySQL无法创建外键、查询外键的属性

MySQL存储引擎--MyISAM与InnoDB区别 - 上善若水,水善利万物而不争. - CSDN博客  http://blog.csdn.net/xifeijian/article/details/20316775 MyISAM 和InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比Inno

Oracle数据库,非空约束、主键约束、外键约束、唯一约束

非空约束:设置列时,可为空默认可为空,去掉对号之后设置数据不可为空: 唯一约束:在键中设置,唯一约束名称.类型Unique.列名:设置应用完成之后,此列数据具有唯一性:即数据不可重复 主键约束:主键列自动具有非空约束和唯一约束,一个表只能有一个主键约束(自动生成索引,提高查询效率)

MySQL的几个概念:主键,外键,索引,唯一索引

概念: 主键(primary key) 能够唯一标识表中某一行的属性或属性组.一个表只能有一个主键,但可以有多个候选索引.主键常常与外键构成参照完整性约束,防止出现数据不一致.主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引. 外键(foreign key) 是用于建立和加强两个表数据之间的链接的一列或多列.外键约束主要用来维护两个表之间数据的一致性.简言之,表的外键就是另一表的主键,外键将两表联系起来.一般情况下,要删除一张表中的主键必须首

Entity Framework Code First主外键关系映射约定

本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个不同表之间可以存在外键依赖关系,一个表自身也可以有自反关系(表中的一个字段引用主键,从而也是外键字段). Entity Framework Code First默认多重关系的一些约定规则: 一对多关系:两个类中分别包含一个引用和一个集合属性,也可以是一个类包含另一个类的引用属性,或一个类包含另一个类