首页 >数据库 >mysql教程 > 正文

联合主键和复合主键的区别

转载2019-08-28 14:22:4501350
一、复合主键

所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。

例如:

create table test 
( 
   name varchar(19), 
   id number, 
   value varchar(10), 
   primary key (name,id) 
)

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

这里就会有一个疑惑? 主键是唯一的索引,那么为何一个表可以创建多个主键呢?

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

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

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

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

二、联合主键

联合主键顾名思义就是多个主键联合形成一个主键组合(主键原则上是唯一的,别被唯一值所困扰。)

联合主键的意义:用2个字段(或者多个字段,后面具体都是用2个字段组合)来确定一条记录,说明,这2个字段都不是唯一的,2个字段可以分别重复,这么设置的好处,可以很直观的看到某个重复字段的记录条数。

一个简单的例子 :

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

总结: 以我来看复合主键就是含有一个以上的字段组成,如ID+name,ID+phone等,而联合主键要同时是两个表的主题组合起来的。这是和复合主键最大的区别!

相了解更多相关问题请访问PHP中文网:mysql视频教程

以上就是联合主键和复合主键的区别的详细内容,更多请关注php中文网其它相关文章!

php中文网最新课程二维码
  • 相关标签:主键
  • 本文转载于:博客园,如有侵犯,请联系a@php.cn删除
  • 相关文章

    相关视频


    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论
  • Map是值对接口,它实现类要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。Map不允许(key)重,但允许值(Value)重
    Oracle常用分为UUID自增长int两种,UUID生成方便,适批量插入数据更新操作,int占用空间小,性能好,容易记忆;一般在分布式环境中使用UUID作为唯一,至于其他项目建议使用int
    C++ primer plusC++ primer这两本书是面向人群不同,C++ primer plus适零基础人群进行学习,C++ primer 则是适有基础人群进行学习。
    win7题变成黑色解决办法:首先在Win7系统桌面上击右,选择“个性化”选项;然后在打开个性化页面中,选择一个题;接着点击该题应用到系统即可恢正常。

    2019-12-23

    3173

    ai编组快捷是【Ctrl+G】;AI作为一款非常好矢量图形处理工具,该软件要应用于印刷出版、海报书籍排版、专业插画、多媒体图像处理网页面制作等,也可以为线稿提供较高精度控制,适生产任何小型设计到大型杂项目
    本文要介绍了目前开发“Web Service”几个框架,分为Axis、axis2、Xfire、CXF以及JWS之间针对不同情况应该如何选择适自己项目服务框架。
    redis是值对数据库,有5中要数据类型,分为字符串类型(string),散列类型(hash),列表类型(list),集类型(set),有序集类型(zset)。
    包是函数数据,go语言中用package关字定义一个包。要用于组织Go源代码,提供了更好可重用性与可读性。
    ubuntu进入命令行界面方法是:1、进入ubuntu界面;2、按下【ctrl+alt+F2~F6】组;3、输入需要登录账户密码,回车,这样就成功切换到命令行界面了。
    :1、容器不同,ASP一般是IIS,JSP一般是符JEE规格执行容器,PHP当然是其官方解释器;2、ASP动态代码语言要是C#VB,JSP则是Java,PHP当然是自定义PHP语言;3
    局域网拓扑结构可以是总线型、星型环型;网络中计算机等设备要实现互,就需要以一定结构方式进行连接,这种连接方式就叫做拓扑结构;而目前常见网络拓扑结构要有4类,即星型结构、总线型结构、环型结构型结构
    【php、asp、jsp】三者是:1、容器不同,ASP一般是IIS,JSP一般是符JEE规格执行容器,PHP当然是其官方解释器;2、语言不同,ASP动态代码语言要是C#VB,JSP则是
    yii框架要用于开发各种用PHP构建Web应用。Yii框架是一个通用Web编程框架,因为基于组件框架结构设计精巧缓存支持,它特开发大型应用,如门户网站、社、内容管理系统等。
    :win10专业版面向使用PC、平板电脑一设备企业用户;要面向技术爱好者企业/技术人员。
    java入门教程:本文为大家介绍了Java中class与Class有什么,具有一定参考价值,希望可以帮助到大家。class是Java中字,在声明类时使用。
    phpjava有:1、Java是一门面向对象编程语言,而PHP是一种通用开源脚本语言;2、PHP比Java简单很多;3、PHP要是应用在网站方面,它适快速开发,而Java应用领域比较广泛,
    :php要是部署网站用,所以大部分时候是要嵌在HTML语言里面,并且与JS混在一起,所以表面看上去很乱,远远没有C语言单纯。

    专题推荐

    推荐视频教程
  • MySQLi面向对象编程极速入门MySQLi面向对象编程极速入门
  • MySQL优化视频教程—布尔教育MySQL优化视频教程—布尔教育
  • Apache和MySQL安装使用教程Apache和MySQL安装使用教程
  • MySQL数据管理之备份恢复案例解析视频教程MySQL数据管理之备份恢复案例解析视频教程
  • 视频教程分类