首先看看各种键的定义:

超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键(只要有一个键唯一,再随便组其他的键,合起来叫主键)

候选键(candidatekey):不含有多余属性的超键称为候选键(最小的超键,ID,身份证号)

主键(primary key):关系型数据库中的一条记录中有若干个属性,若其中某一个属性(注意是)能唯一标识一条记录,该属性组就可以成为一个主键 (在超键选取一个作为主键,如果有多个字段的叫为联合主键)

外键(foreign key)如果关系模式R1中的某属性集不是R1的主键,而是另一个关系R2的主键则该属性集是关系模式R1的外键。

结合实例的具体解释:

假设有如下两个表:

学生(学号,姓名,性别,身份证号,教师编号)

教师(教师编号,姓名,工资)

超键:

由超键的定义可知,学生表中含有学号或者身份证号的任意组合都为此表的超键。如:(学号)、(学号,姓名)、(身份证号,性别)等。

候选键:

候选键属于超键,它是最小的超键,就是说如果再去掉候选键中的任何一个属性它就不再是超键了。学生表中的候选键为:(学号)、(身份证号)。

主键:

主键就是候选键里面的一个,是人为规定的,例如学生表中,我们通常会让“学号”做主键,教师表中让“教师编号”做主键。

外键:

外键比较简单,学生表中的外键就是“教师编号”。外键主要是用来描述两个表的关系。


超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键

候选键(candidate key):不含有多余属性的超键称为候选键

主键(primary key):用户选作元组标识的一个候选键程序主键

比如一个小范围的所有人,没有重名的,考虑以下属性

身份证 姓名 性别 年龄

身份证唯一,所以是一个超键

姓名唯一,所以是一个超键

(姓名,性别)唯一,所以是一个超键

(姓名,性别,年龄)唯一,所以是一个超键

--这里可以看出,超键的组合是唯一的,但可能不是最小唯一的

身份证唯一,而且没有多余属性,所以是一个候选键

姓名唯一,而且没有多余属性,所以是一个候选键

--这里可以看出,候选键是没有多余属性的超键

考虑输入查询方便性,可以选择 身份证 为主键

也可以 考虑习惯 选择 姓名 为主键

--主键是选中的一个候选键

一题搞懂什么是候选键

看下题目先

在SQL Server数据库中,有一个学生信息表如下所示,在该表中不能作为候选键的属性集合为( ) (选择一项) 

学号 姓名 性别 年龄 系别 专业

20020612 李辉 男 20 计算机 软件开发

20060613 张明 男 18 计算机 软件开发

20060614 王小玉 女 19 物理 力学

20060615 李淑华 女 17 生物 动物学

20060616 赵静 男 21 化学 食品化学

20060617 赵静 女 20 生物 植物学

a){学号}

b){学号、姓名}

c){年龄、系别}

d){姓名、性别}

e){姓名、专业}

可能大家不知道如何来选择。如果这个题目我们可以正确的解答,那么对于超键以及候选键和主键的概念已经有很深刻的认识了。

看下概念:

超键:在关系中能惟一标识元组的属性集称为关系模式的超键。

候选键:不含有多余属性的超键称为候选键。也就是在候选键中,若要再删除属性就不是键了。

主键:用户选作元组标识的一个候选键称为主键。

透过概念,我们可以了解到,超键包含着候选键,候选键中包含着主键。主键一定是惟一的。为什么呢?因为他的爷爷超键就是惟一的。

我们分析一下上面的题目,abcde5个答案都可以作为超键,他们组合在一起的集合可以用来惟一的标识一条数据记录(实体)。

请注意我们的要求:候选键。候选键要求是不能包含多余属性的超键,我们看一下答案b。在答案b中,如果我们不使用姓名也可以惟一的 

标识一条数据实体,可以说姓名字段在这里是多余的。那么很明显,b选项包含了多余字段属性。那么这题答案应该选择b

那么其他的4个选项都可以作为候选键,假设很幸运,a)学号 被选择作为用户正在使用的候选键来惟一标识元组了,那么他很幸运的获得了主键的称号。


联合主键 复合主键

其实“主键是唯一的索引”这话有点歧义的。举个例子,我们在表中创建了一个ID字段,自动增长,并设为主键,这个是没有问题的,因为“主键是唯一的索引”,ID自动增长保证了唯一性,所以可以。

此时,我们再创建一个字段name,类型为varchar,也设置为主键,你会发现,在表的多行中你是可以填写相同的name值的,这岂不是有违“主键是唯一的索引”这句话么?

所以我才说“主键是唯一的索引”是有歧义的。(复合主键)应该是“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。

为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢。因为,并不是所有的表都要有ID这个字段啊哈哈,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生的名字、年龄、班级都可能重复,无法使用单个字段来唯一标识,这时,我们可以将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。

什么是数据表的复合主键

所谓的复合主键 就是指你表的主键含有一个以上的字段组成
比如
create table test
(
   name varchar(19),
   id number,
   value varchar(10),
   primary key (name,id)
)

上面的name和id字段组合起来就是你test表的复合主键

它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性
一般情况下,主键的字段长度和字段数目要越少越好

联合主键
什么是联合主键?
(主键原则上是唯一的,别被唯一值所困扰。)
顾名思义就是多个主键联合形成一个主键组合
一个简单的例子
主键A跟主键B组成联合主键
主键A跟主键B的数据可以完全相同(困扰吧,没关系),联合就在于主键A跟主键B形成的联合主键是唯一的。
下例主键A数据是1,主键B数据也是1,联合主键其实是11,这个11是唯一值,绝对不充许再出现11这个唯一值。(这就是多对多关系)
主键A数据主键B数据
1      1
2      2
3      3
主键A与主键B的联合主键值最多也就是
11
12
13
21
22
23
31
32
33

超键、候选键、主键、外键、联合主键、复合主键相关推荐

  1. 数据库原理与应用(SQL Server)教程 主键、外键以及联合主键、复合主键和设置种子数目和增量

    文章目录 前言 一.主键.联合主键和复合主键 (一)主键 (二)联合主键 (三)复合主键 二.外键.设置种子数目和增量 (一)外键的概念 (二)添加外键 (三)设置种子数目和增量 结语 前言 这篇文章 ...

  2. MySql的复合主键和联合主键的介绍

    我的个人博客 百度搜索:[迷你酷吧]网址:https://www.minikuba.com,迷你酷吧是一个基于程序员经验为基础分享技术文章.算法解题.大厂面试真题.热门项目的平台,致力于为大家提供更多 ...

  3. 对逻辑主键、业务主键和复合主键的思考

    这几天对逻辑主键.业务主键和复合主键进行了一些思考,也在网上搜索了一下相关的讨论,相关讨论可以看最下面的参考链接.下面是自己基于 SQL Server 做的一些总结,其他数据库(Oracle.MySQ ...

  4. SpringData JPA复合主键

    一.JPA和复合主键的简介        JPA全称Java Persistence API,是一组用于将数据存入数据库的类和方法的集合.JPA通过JDK5.0注解或XML描述对象-关系表的映射关系, ...

  5. mysql 隐式主键_MySQL中复合主键性能的缺点

    我们有一个表,该表具有由三个字段组成的复合主键(在MySQL 5.1中是这样). 该表上每秒有近200个插入和200个选择,并且表的大小约为100万行,并且还在不断增加. 我的问题是:"复合 ...

  6. Hibernate复合主键映射

    目录: 1. 实现方式一:将复合主键对应的属性与实体其他普通属性放在一起 2. 实现方式二:将主键属性提取到一个主键类中,实体类只需包含主键类的一个引用 在日常开发中会遇到这样一种情况,数据库中的某张 ...

  7. sql超键 候选键 主键

    超键:如bai果一个关系(表)du中所有属性(列)都由zhi一个属性集合决定,那么这组属性集合称为超键. 显然,由一个关系的所有属性组成的属性集合必然是这个关系的超键. 通俗地讲,超键用来唯一确定一个 ...

  8. 数据库中什么是主键,什么是外键?

    数据库中什么是主键,什么是外键? 作者:不染丹心  来源:博客园  发布时间:2009-12-17 22:57  阅读:128 次  原文链接   [收藏]   这需要理清几个概念: 1)候选键: 关 ...

  9. sql 复合主键 联合主键_学习SQL:主键

    sql 复合主键 联合主键 If you've already worked with databases, then you could hardly miss the term – Primary ...

最新文章

  1. docker history显示完整信息_Docker使用
  2. Google AI 又来放大招,放射科医生会被取代吗?
  3. 在Java中使用redisTemplate操作缓存
  4. 问题记录:如何比较两个字符串的相似度
  5. 943. Find the Shortest Superstring
  6. 主链增幅最高飚至 152%,主流币却惊现回落;以太坊发币速度持续放缓
  7. Linux 网络编程 —— TCP编程之客户端 向服务器发送数据 接收服务器发来的数据
  8. 使用jquery 给span 赋值
  9. 除了自定义cell以为,还可以通过属性来控制cell线条的长度
  10. Kubernetes Jobs - 运行处理任务指南
  11. 线程之线程同步(1)
  12. win95软盘版安装方法
  13. 内网,外网ip(路由器ip,公网ip)的分别以及如何查询
  14. linux aria2 离线,使用aria2做离线下载
  15. 用Photoshop抠图
  16. C#之使用RichTextBox 实现简单的txt编辑器
  17. EBP与ESP的作用
  18. 石大师装机大师怎么重装系统
  19. python3-xlsx表格文件读取
  20. 初识EMC元器件(五)——电容参数解读及选型应用

热门文章

  1. 差分约束 4416 FFF 团卧底的后宫
  2. 制作越狱版本的ipa文件
  3. windows远程修改密码
  4. Unity3D之预设
  5. 【原创】Windows® Embedded CE 6.0 Fundamentals 读书笔记_Chapter 9
  6. Windows XP with SP3 All Edtion Download
  7. 简单C语言程序的执行过程
  8. 全局静态存储区、堆区和栈区深入剖析
  9. 数字图像处理实验(总计23个)汇总
  10. 判断ipv6地址_#网络工程师#5分钟教你搞懂IPV6如何发现邻居